2008-09-18 62 views
9

Windows Server 2003有一個限制,它可以防止您複製超大型文件,與您擁有的RAM數量成比例。限制在CopyFile和CopyFileEx函數中,這些函數由xcopy,Explorer,Robocopy和.NET FileInfo類使用。如何在沒有CopyFile或CopyFileEx的情況下在Windows上覆制大文件?

這裏是你的錯誤:

無法複製[文件名]:有足夠的系統資源來完成所請求的服務。

的是關於這一主題的knowledge base article,但它涉及到NT4和2000年

還有從Exchange安裝use ESEUTIL一個建議,但我沒有任何運氣得到那個工作。

有沒有人知道一個快速,簡單的方法來處理這個問題?我正在談論2Gb內存的機器上> 50Gb。我打算啓動Visual Studio,並且爲我寫一些東西來完成它,但是如果有一些已經存在的,穩定和經過充分測試的應用程序將會很好。

[編輯]我提供了工作的C#代碼來陪同接受的答案。

回答

13

最好的選擇是打開原來的文件進行讀取,寫入的目標文件,然後循環複製塊逐塊。在僞代碼:

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

[提問者編輯]好吧,這是它的外觀在C#(它是緩慢的,但它似乎工作正常,並且給出了進步):

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

至少使用100KB更好1MB的緩存。這將極大地加速文件複製! – 2008-11-19 15:02:55

6

如果你想寫代碼,你可以優化的一種方式是發送文件(如使用MTOM)。我用這種方法從數據中心向下發送大文件到我們的辦公室打印..

此外,檢查TeraCopy的效用提到here ..

相關問題