Pregunta

Hay una limitación en Windows Server 2003 que impide copiar archivos muy grandes, en proporción a la cantidad de RAM que tiene.La limitación está en la CopyFile CopyFileEx funciones, que son utilizados por xcopy, Explorer, Robocopy, y la .NETO de la clase FileInfo.

Aquí es el error que se obtiene:

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

El es un artículo de knowledge base sobre el tema, sino que se refiere a NT4 y 2000.

También hay una sugerencia de que se el uso de ESEUTIL a partir de una instalación de Exchange, pero no he tenido suerte conseguir que funcione.

¿Alguien sabe de una manera fácil y rápida de manejar esto?Estoy hablando de >50 gb en un equipo con 2 gb de RAM.Pienso que el fuego de Visual Studio y escribir algo para que me haga esto, pero sería bueno tener algo que ya estaba por ahí, estable y bien probado.

[Editar] Yo siempre trabajo de código de C# para acompañar a la aceptada respuesta.

¿Fue útil?

Solución

La mejor opción es abrir el archivo original para la lectura, el archivo de destino para la escritura y, a continuación, bucle de copiar, 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 el usuario que pregunta] Ok, esta es la forma en que se ve en C# (es lento, pero parece que funciona Ok, y se da el 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");
        }
    }
}

Otros consejos

Si usted desea escribir código, una forma de optimizar es enviar el archivo en trozos (como el uso de MTOM).He utilizado este enfoque para el envío de archivos de gran tamaño de un centro de datos de abajo a nuestra oficina para imprimir..

También, compruebe el TeraCopy utilidad mencionado aquí..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top