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

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top