Эффективное копирование нескольких файлов

Мне приходится копировать довольно много файлов из одной папки в другую. В настоящее время я делаю это таким образом:

string[] files = Directory.GetFiles(rootFolder, "*.xml");
foreach (string file in files)
{
    string otherFile = Path.Combine(otherFolder, Path.GetFileName(file));
    File.Copy(file, otherFile);
}

Это самый действенный способ? Кажется, это займет много времени.

РЕДАКТИРОВАТЬ: я действительно спрашиваю, есть ли более быстрый способ сделать пакетное копирование вместо копирования отдельных файлов, но я думаю, что ответ - нет.


person Grzenio    schedule 21.10.2008    source источник


Ответы (3)


Я не могу придумать более эффективного способа, чем File.Copy, он идет прямо в ОС.

С другой стороны, если это займет так много времени, я настоятельно рекомендую показать диалоговое окно прогресса, например SHFileOperation сделает это за вас. По крайней мере, ваши пользователи будут знать, что происходит.

person liggett78    schedule 21.10.2008
comment
Разве вы не знали, что на самом деле все идет быстрее, когда вы добавляете индикатор выполнения. По крайней мере, так вам скажет пользователь. - person Kibbee; 21.10.2008

Вы можете использовать операционную систему для перемещения файлов. Это то, что делают такие инструменты, как WinMerge. Вы нажимаете кнопку «Копировать» в своем приложении, и появляется всплывающее окно хода выполнения Windows, как если бы вы использовали Проводник для организации копии. Эта ветка описывает это.

person Michael Haren    schedule 21.10.2008

Недавно я реализовал свои копии файлов с помощью файловых потоков в VB .NET:

fsSource = New FileStream(backupPath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None, 1024, FileOptions.WriteThrough)
fsDest = New FileStream(restorationPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, 1024, FileOptions.WriteThrough)
TransferData(fsSource, fsDest, 1048576)

    Private Sub TransferData(ByVal FromStream As IO.Stream, ByVal ToStream As IO.Stream, ByVal BufferSize As Integer)
        Dim buffer(BufferSize - 1) As Byte

        Do While IsCancelled = False 'Do While True
            Dim bytesRead As Integer = FromStream.Read(buffer, 0, buffer.Length)
            If bytesRead = 0 Then Exit Do
            ToStream.Write(buffer, 0, bytesRead)
            sizeCopied += bytesRead
        Loop
    End Sub

Кажется быстрым и очень простым способом обновить индикатор выполнения (с помощью sizeCopied) и отменить передачу файла, если это необходимо (с помощью IsCancelled).

person JFV    schedule 21.10.2008