Eficaz copiar vários arquivos
Pergunta
Eu tenho que copiar um monte de arquivos de uma pasta para outra. Atualmente estou fazendo isso desta forma:
string[] files = Directory.GetFiles(rootFolder, "*.xml");
foreach (string file in files)
{
string otherFile = Path.Combine(otherFolder, Path.GetFileName(file));
File.Copy(file, otherFile);
}
É que a maneira mais eficiente? Parece tomar as idades.
EDIT:. Eu estou realmente perguntando se existe uma maneira mais rápida para fazer uma cópia em lote, em vez de copiar arquivos individuais, mas acho que a resposta é não
Solução
Eu não posso pensar de uma maneira mais eficiente do que File.Copy, ele vai diretamente para o sistema operacional.
Por outro lado, se leva tanto tempo, eu sugeriria fortemente para mostrar um diálogo de progresso - como SHFileOperation faz isso por você. Pelo menos seus usuários saberão o que está acontecendo.
Outras dicas
Você pode usar o sistema operacional para mover os arquivos. Isto é o que ferramentas como WinMerge fazer. Você clica no botão "cópia" em seu aplicativo e ele aparece caixa de progresso do Windows como se você tivesse usado Explorer para organizar a cópia. Esta discussão descreve.
Eu recentemente implementado minhas cópias de arquivos usando FileStreams em 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
Parece rápido e uma maneira muito fácil de atualizar a barra de progresso (com sizeCopied) e cancelar a transferência de arquivos, se necessário (com IsCancelled).