Wie kann ich eine große Datei auf Windows ohne Copyfile oder CopyFileEx kopieren?

StackOverflow https://stackoverflow.com/questions/92114

  •  01-07-2019
  •  | 
  •  

Frage

Es gibt eine Einschränkung auf Windows Server 2003, die Sie aus dem Kopieren extrem große Dateien, im Verhältnis zu der Menge an RAM verhindert, dass Sie haben. Die Begrenzung ist in der Copyfile und CopyFileEx Funktionen, die von xcopy, Explorer, Robocopy verwendet werden, und die .NET-Klasse Fileinfo.

Hier ist der Fehler, die Sie erhalten:

  

kann nicht kopiert werden [Dateiname]. Nicht genügend Systemressourcen, um den angeforderten Dienst auszuführen

Das ist ein Knowledge Base-Artikel zu diesem Thema, aber es bezieht sich auf NT4 und 2000.

Es gibt auch einen Vorschlag,

War es hilfreich?

Lösung

Die beste Möglichkeit ist, nur die Original-Datei öffnet zum Lesen, die Zieldatei zum Schreiben und dann Schleife Kopiert es Block für Block. In Pseudo-Code:

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();

[Edit von Asker] Ok, das ist, wie es in C # sieht (es ist langsam, aber es scheint gut zu funktionieren, und es gibt Fortschritt):

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");
        }
    }
}

Andere Tipps

Wenn Sie möchten, Code schreiben, eine Möglichkeit, Sie optimieren können, wird die Datei in Blöcken zu senden (wie mit MTOM ). Ich habe diesen Ansatz für das Senden von unten großen Dateien von einem Datacenter bis zu unserem Büro für den Druck ..

Überprüfen Sie außerdem die TeraCopy Dienstprogramm erwähnt hier ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top