2008-09-18 19 views
9

Windows Server 2003'te aşırı büyük dosyaları, sahip olduğunuz RAM miktarıyla orantılı olarak kopyalamanızı önleyen bir sınırlama vardır. Sınırlama, xcopy, Explorer, Robocopy ve .NET FileInfo sınıfı tarafından kullanılan CopyFile ve CopyFileEx işlevlerinde bulunur.Büyük bir dosyayı Windows'ta CopyFile veya CopyFileEx olmadan nasıl kopyalarım?

[dosya adı] kopyalanamıyor: Yetersiz sistem kaynakları istenen hizmeti tamamlamak için var Burada

Alacağınız hatadır.

Özne üzerinde bir knowledge base article, ancak NT4 ile ilgilidir ve 2000

da bir Exchange yüklemesinden use ESEUTIL için bir öneri yoktur, ancak hiçbir şansım çalışmalarına çıkardın olmadı .

Bunu halletmenin hızlı ve kolay bir yolu olduğunu bilen var mı? 2Gb RAM içeren bir makinede> 50Gb'den bahsediyorum. Visual Studio'yu ateşlemeyi ve sadece benim için yapacak bir şeyler yazmayı planlıyorum, ama zaten orada olan, kararlı ve iyi test edilmiş bir şey olması güzel olurdu.

[Düzenle] Kabul edilen yanıtla birlikte çalışmak için C# kodu sağladım.

cevap

13

En iyi seçenek okumak için orijinal dosyayı açmak, hedef dosya yazmak için yazmak ve daha sonra blok kopyalayarak bloklamaktır. pseudocode:

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

[Sahibinin Düzenle] Tamam, işte bu C# görünüyor (Bu yavaş ama Tamam iş gibi görünüyor ve ilerleme verir) nasıl:

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

kullanılması, en azından bir 100 KB daha iyi bir 1MB tampon kontrol Ayrıca baskı için ofisimize bir DataCenter'da büyük dosyaları aşağı aşağı göndermek için bu yaklaşımı ..

kullandı. Bu dosya kopyasını büyük ölçüde hızlandıracak! –

+1

Oynamak için 2 GB var ...;) Cidden, Aaron haklı - okuma/yazma arabelleğe çarpmak. – GalacticCowboy

6

ise Kod yazmak istiyorsanız, optimize edebileceğiniz bir yol dosyayı (MTOM kullanarak) parça halinde gönderir. Ben .. TeraCopy yarar here söz

İlgili konular