una ruta otra obtener net manipular informacion guardar especifica eliminar ejemplo directorios directorio copiar copia carpeta archivos archivo c# windows file-io

ruta - obtener informacion de un archivo c#



¿Cómo puedo copiar un archivo grande en Windows sin CopyFile o CopyFileEx? (2)

Existe una limitación en Windows Server 2003 que le impide copiar archivos extremadamente grandes, en proporción a la cantidad de RAM que tiene. La limitación está en las funciones CopyFile y CopyFileEx, que son utilizadas por xcopy, Explorer, Robocopy y la clase .NET FileInfo.

Aquí está el error que obtienes:

No se puede copiar [nombre de archivo]: existen recursos de sistema insuficientes para completar el servicio solicitado.

El es un artículo de la base de conocimientos sobre el tema, pero pertenece a NT4 y 2000.

También hay una sugerencia para usar ESEUTIL desde una instalación de Exchange, pero no he tenido suerte para que funcione.

¿Alguien sabe de una manera rápida y fácil de manejar esto? Estoy hablando de> 50 Gb en una máquina con 2 Gb de RAM. Planeo arrancar Visual Studio y simplemente escribir algo para hacerlo por mí, pero sería bueno tener algo que ya estuviera disponible, estable y bien probado.

[Editar] Proporcioné el código de trabajo C # para acompañar la respuesta aceptada.


La mejor opción es simplemente abrir el archivo original para leer, el archivo de destino para escribir y luego copiarlo en bloque, bloque por bloque. En pseudocódigo:

f1 = open(filename1); f2 = open(filename2, "w"); while( !f1.eof() ) { buffer = f1.read(buffersize); err = f2.write(buffer, buffersize); if err != NO_ERROR_CODE break; } f1.close(); f2.close();

[Editar por preguntando] Ok, así es como se ve en C # (es lento pero parece funcionar bien, y da progreso):

using System; using System.Collections.Generic; using System.IO; using System.Text; namespace LoopCopy { class Program { static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine( "Usage: LoopCopy.exe SourceFile DestFile"); return; } string srcName = args[0]; string destName = args[1]; FileInfo sourceFile = new FileInfo(srcName); if (!sourceFile.Exists) { Console.WriteLine("Source file {0} does not exist", srcName); return; } long fileLen = sourceFile.Length; FileInfo destFile = new FileInfo(destName); if (destFile.Exists) { Console.WriteLine("Destination file {0} already exists", destName); return; } int buflen = 1024; byte[] buf = new byte[buflen]; long totalBytesRead = 0; double pctDone = 0; string msg = ""; int numReads = 0; Console.Write("Progress: "); using (FileStream sourceStream = new FileStream(srcName, FileMode.Open)) { using (FileStream destStream = new FileStream(destName, FileMode.CreateNew)) { while (true) { numReads++; int bytesRead = sourceStream.Read(buf, 0, buflen); if (bytesRead == 0) break; destStream.Write(buf, 0, bytesRead); totalBytesRead += bytesRead; if (numReads % 10 == 0) { for (int i = 0; i < msg.Length; i++) { Console.Write("/b /b"); } pctDone = (double) ((double)totalBytesRead / (double)fileLen); msg = string.Format("{0}%", (int)(pctDone * 100)); Console.Write(msg); } if (bytesRead < buflen) break; } } } for (int i = 0; i < msg.Length; i++) { Console.Write("/b /b"); } Console.WriteLine("100%"); Console.WriteLine("Done"); } } }


Si desea escribir código, una forma de optimizarlo es enviar el archivo en fragmentos (como usar MTOM ). Utilicé este enfoque para enviar grandes archivos de un DataCenter a nuestra oficina para imprimirlos.

Además, consulte la utilidad TeraCopy mencionada aquí ..