2008-10-21 17 views
10

Tengo que copiar bastantes archivos de una carpeta a otra. Actualmente lo estoy haciendo de esta manera:Copia efectiva de varios archivos

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

¿Es esa la manera más eficiente? Parece tomar edades.

EDITAR: Realmente estoy preguntando si hay una forma más rápida de hacer una copia por lotes, en lugar de copiar archivos individuales, pero supongo que la respuesta es no.

Respuesta

8

No se me ocurre una manera más eficiente que File.Copy, va directamente al SO.

Por otro lado, si lleva tanto tiempo, le sugiero que muestre un cuadro de diálogo de progreso, como SHFileOperation lo hace por usted. Al menos tus usuarios sabrán lo que está sucediendo.

+3

¿Sabía que las cosas realmente van más rápido cuando agrega una barra de progreso? Al menos, eso es lo que el usuario le dirá. – Kibbee

1

Puede usar el sistema operativo para mover los archivos. Esto es lo que hacen las herramientas como WinMerge. Hace clic en el botón "copiar" en su aplicación y aparece el cuadro de progreso de Windows como si hubiera usado Explorer para organizar la copia. This thread lo describe.

1

he implementado recientemente mis copias de archivos utilizando FileStreams en 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 y de una manera muy fácil de actualizar el progressbar (con sizeCopied) y cancelar la transferencia de archivos si es necesario (con IsCancelled)