Как скопировать файл с помощью языка c#?

C# Как скопировать файл?

Из этой статьи Вы узнаете, как скопировать файл, используя язык c#. Но, для начала хотелось бы сказать, что, не смотря на то, что данная операция на самом деле состоит из нескольких этапов, например, таких как создание нового файла, по байтовое копирование информации, удаление старого файла. В языке csharp нас избавили от всех этих «мелких нюансов», поэтому для того, чтобы скопировать файл 1.txt из папки c:\dir1 в папку с:\dir2, вам всего лишь нужно в своей программе написать буквально одну строчку кода.

using System.IO; //добавить!
File.Copy(@"C:\dir1\1.txt", @"C:\dir2\2.txt", true);

Для работы мы используем класс File и метод Copy, в который в качестве первого параметра, передаём полный путь к файлу, который необходимо скопировать. Вторым параметров указываем, куда мы копируем файл. Третий, необязательный параметр, который имеет тип bool, позволяет определить действие, которое нужно выполнить, если в папке dir2 уже содержится файл (2.txt). Например, если установить значение true, то тогда при копировании файла (1.txt), файл (2.txt) будет перезаписан, если же мы установим значение false, то в таком случае получим выброс исключения, так как файл уже существует, а его изменение (перезапись) мы запретили.

Так же не забывайте при работе с пространством имён System.IO использовать блоки try catch.

try
{
File.Copy();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Как скопировать все файлы?

И ещё один пример, в котором рассмотрим простую задачу, в которой нужно скопировать все файлы из папки Dir1 в папку Dir2.

//откуда копируем
string Dir1 = @"C:\Dirs\Dir1";
//куда копируем
string Dir2 = @"C:\Dirs\Dir2";
try
{
DirectoryInfo dirInfo = new DirectoryInfo(Dir1);
foreach (FileInfo file in dirInfo.GetFiles("*.*"))
{
File.Copy(file.FullName, Dir2 + "\\" + file.Name, true);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Сначала с помощью метода GetFiles, используя маску (*.*), получаем все файлы в папке Dir1, а затем по очереди копируем их. Если Вам необходимо скопировать все файлы только какого-то определенного типа, например все текстовые файлы (.txt), то тогда указываем маску (*.txt), для mp3 файлов (*.mp3) и так далее. Значение true указываем в том случаи, если требуется перезаписать старые файлы в папке Dir2.

Читайте также:

20 комментариев

  1. Саня says:

    хм, к примеру я получил список файлов в папке и подпапках с датой изменения

    string[] files = Directory.GetFiles(@"C:2", "*", SearchOption.AllDirectories);
    for (int i = 0; i < files.Length; i++)
    {
    listBox1.Items.Add(files[i] + " " + File.GetLastWriteTime(files[i]));
    }

    а как теперь скопировать все файлы к примеру в c:1 и потом через некоторе время скопировать файлы которые изменились?

  2. &#171;а как теперь скопировать все файлы к примеру в c:1&#187;

    string[] files = Directory.GetFiles(@"C:2");
    FileInfo fi;
    foreach (string file in files)
    {
    fi = new FileInfo(file);
    File.Copy(file, "C:\1\" + fi.Name);
    //или
    //File.Copy(file, "C:\1\" + Path.GetFileName(file));
    }
    //или
    DirectoryInfo dirInfo = new DirectoryInfo(@"C:2");
    foreach (FileInfo file in dirInfo.GetFiles())
    {
    File.Copy(file.FullName, "C:\1\" + file.Name);
    }

    &#171;и потом через некоторе время скопировать файлы которые изменились?&#187;

    Например, можно добавить таймер и запускать его сразу после первого копирования.

    timer1.Enabled = true;
    timer1.Interval = //уст. какой-то интервал времени;
    timer1.Tick += new EventHandler(timer1_Tick);
    void timer1_Tick(object sender, EventArgs e)
    {
    //1. Проверяем есть ли изменения
    //2. Копируем файлы, которые изменились
    }
  3. Саня says:
    string[] files = Directory.GetFiles(@"C:2");
    FileInfo fi;
    foreach (string file in files)
    {
    fi = new FileInfo(file);
    File.Copy(file, "C:\1\" + fi.Name);
    }

    пару вопросов, что не задал сразу, сорри!
    этим кодом я копирую файлы в папке 2, но в ней есть подпапки, а как скопировать все папки со всеми файлами? список папок и файлов я получаю в приведенным мной кодом выше, так же я получаю дату изменения, к примеру я первый раз сразу копирую все папки и файлы из 2, а потом будет работать таймер по которому будет копирование измененых файлов. Точнее я же получаю список файлов и папок в листбокс1, это к примеру, при запуске программы и сразу их копирую, а потом работает таймер, где я уже вывожу список папок и файлов листбокс2, и потом ведь я могу их сравнить и удалить совпадения по дате изменения, и остануться те которые нужно будет скопировать&#8230;) как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))

  4. &#171;как скопировать все папки со всеми файлами&#187;

    можно использовать рекурсию, например:

    //рекурсия
    private void CopyDirsAndFiles(string FromDir, string ToDir)
    {
    Directory.CreateDirectory(ToDir);
    foreach (string file in Directory.GetFiles(FromDir))
    {
    File.Copy(file, ToDir + "\" + Path.GetFileName(file));
    }
    foreach (string dir in Directory.GetDirectories(FromDir))
    {
    CopyDirsAndFiles(dir, ToDir + "\" + Path.GetFileName(dir));
    }
    }
    //откуда - куда
    CopyDirsAndFiles("C:\2", "C:\1");

    &#171;как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))&#187;

    private void Form1_Load(object sender, EventArgs e)
    {
    timer1.Enabled = false;
    CopyDirsAndFiles(); //копирует 1 раз
    timer1.Enabled = true;
    timer1.Tick += new EventHandler(timer1_Tick);
    }
    void timer1_Tick(object sender, EventArgs e)
    {
    //1. Проверяем есть ли изменения
    //2. Копируем файлы, которые изменились
    }
  5. Саня says:

    если честно, то у меня ничего не выходит, что то я совсем запутался вот полный листинг кода, задача получить все файлы и папки с подпапками в с:2 вывести листбокс1, потом скопировать в c:1, а там уже сам))
    [cut]

  6. void CopyAllDirsAndFiles(string FromDir, string ToDir)
    {
    Directory.CreateDirectory(ToDir);
    listBox1.Items.Add(ToDir);
    foreach (string file in Directory.GetFiles(FromDir))
    {
    File.Copy(file, ToDir + "\" + Path.GetFileName(file));
    listBox1.Items.Add(file);
    }
    foreach (string dir in Directory.GetDirectories(FromDir))
    {
    CopyAllDirsAndFiles(dir, ToDir + "\" + Path.GetFileName(dir));
    }
    }
  7. Саня says:

    File.Copy(file, ToDir + &#171;\&#187; + Path.GetFileName(file));
    подскажи, а как сделать перезапись файл &#8212; этот метод запрещает это сделать? и такой если файл будет открыт, он скопируеться?

  8. &#171;подскажи, а как сделать перезапись файл — этот метод запрещает это сделать?&#187;

    Ответ на этот вопрос есть в статье.

    &#171;если файл будет открыт, он скопируеться?&#187;

    Да, но лучше всё равно обработать возможность возникновения System.IO.IOException

  9. Саня says:

    админ, я использую CopyDir(@&#187;C:2&#8243;, @&#187;C:1&#8243;) а как указать вместо c:2 список папок в листбокс? пробывал пару вариантов, но видать не правильно

  10. listBox1.Items.Add("c:\2");
    listBox1.Items.Add("c:\3");
    listBox1.Items.Add("c:\4");
    foreach (string dir in listBox1.Items)
    {
    CopyDir(dir, @"C:1");
    }
  11. Саня says:

    админ, новерно крайний вопрос)) в листбокс файл + дата изменения, скопировать как не получаеться и оно понятно, а как отделить при копировании дату изменения до пробела

    foreach (string f in Directory.GetFiles(FromDir))
    {
    listBox2.Items.Add(f + " " + Directory.GetLastWriteTime(FromDir));
    try
    {
    File.Copy(f, ToDir + "\" + Path.GetFileName(f), true);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    }
  12. Получить только путь из строки?

    string str = listBox1.Items[0].ToString();
    string path = str.Substring(0, str.IndexOf(&#039; &#039;));
  13. Саня says:

    Админ а что не правильно, пытаюсь удалить совпадение строк? удаляет только первую

    for ( int i = 0; i < listBox1.Items.Count; i++)
    {
    if (listBox1.Items[i].ToString() == listBox2.Items[i].ToString())
    {
    listBox1.Items.RemoveAt(i);
    }
    }
  14. Поставь точку остановы и посмотри, что происходит со списком listbox1 до удаления элемента и после.

  15. Саня says:

    по идее должны быть так? переменные обьявлены в классе, я понимаю что это должно быть просто, но что то совсем не могу вникнуть&#8230;. очень хочу научится , но самоучкой трудно((

    if (listBox1.Items[w].ToString() == listBox2.Items[q].ToString())
    {
    for ( int w = 0; w < listBox1.Items.Count; w++)
    {
    listBox1.Items.RemoveAt(w);
    }
    }
  16. for (int i=0; i < listBox1.Items.Count; i++)
    {
    for (int k = 0; k < listBox2.Items.Count; k++)
    {
    if (listBox1.Items[i].Equals(listBox2.Items[k]))
    {
    listBox2.Items.Remove(listBox2.Items[k]);
    --k;
    }
    }
    }
  17. Саня says:

    админ привет, подскажи что не так? после удаления сравнений, в листбоксе2 остаеться к примеру путь с:22.txt 11.11.11 11:11 но при использовании ниже приведенного кода, выдаёт ошибку!

    foreach (string fi in listBox2.Items)
    {
    string str = listBox2.Items[0].ToString();
    string path = str.Substring(0, str.IndexOf(' '));
    CopyDir(fi, @"C:1");
    }
  18. выдаёт ошибку

    Привет. Какую?

  19. Саня says:

    решил попробывать вставить рекурсию по нажатию кнопки

    private void button2_Click(object sender,  EventArgs e)
    {
    string ToDir = @"C:1";
    string FromDir = listBox2.Items.ToString();
    Directory.CreateDirectory(ToDir);
    foreach (string fi in listBox2.Items) -  все нормально но потом когда возвращаеться сюда ошибка
    {
    string str = listBox2.Items[0].ToString();
    string path = str.Substring(0, str.IndexOf(' '));
    try
    {
    File.Copy(path, ToDir + "\" + Path.GetFileName(fi), true);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    foreach (string dir in Directory.GetDirectories(@"C:2"))
    {
    CopyDir(dir, ToDir + "\" + Path.GetFileName(dir));
    }
    }
    }

    Необработанное исключение типа &#171;System.InvalidOperationException&#187; в System.Windows.Forms.dll

    Дополнительные сведения: Список, к которому привязан данный перечислитель, был изменен. Перечислитель может использоваться, только если список не изменяется.

  20. По нажатию кнопки должно быть так:

    private void button2_Click(object sender,  EventArgs e)
    {
    CopyAllDirsAndFiles("c:\1", "c:\2");
    }

    Полный код метода CopyAllDirsAndFiles добавлял выше в комментариях.

    Эта строка не содержит путь, хотя и не используется:

    string FromDir = listBox2.Items.ToString();

    Попробовал, исключение не возникает.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*