2008-09-18 33 views
9

Có một giới hạn trên Windows Server 2003 giúp bạn sao chép các tệp cực lớn, tương ứng với số lượng RAM bạn có. Giới hạn nằm trong các hàm CopyFile và CopyFileEx, được sử dụng bởi xcopy, Explorer, Robocopy và lớp .NET FileInfo.Làm cách nào để sao chép tệp lớn trên Windows mà không có CopyFile hoặc CopyFileEx?

Đây là lỗi mà bạn nhận được:

Không thể sao chép [filename]: tài nguyên hệ thống không đủ tồn tại để hoàn thành dịch vụ được yêu cầu.

là một knowledge base article về đề tài này, nhưng nó gắn liền với NT4 và 2000.

Ngoài ra còn có một gợi ý để use ESEUTIL từ một cài đặt Exchange, nhưng tôi đã không có bất kỳ may mắn nhận được rằng để làm việc .

Có ai biết cách nhanh chóng, dễ dàng để xử lý việc này không? Tôi đang nói về> 50Gb trên một máy tính với 2Gb RAM. Tôi có kế hoạch đốt cháy Visual Studio và chỉ viết một cái gì đó để làm điều đó cho tôi, nhưng nó sẽ là tốt đẹp để có một cái gì đó đã được ra khỏi đó, ổn định và được thử nghiệm tốt.

[Chỉnh sửa] Tôi đã cung cấp mã C# hoạt động để đi cùng với câu trả lời được chấp nhận.

Trả lời

13

Tùy chọn tốt nhất là chỉ cần mở tệp gốc để đọc, tệp đích để ghi và sau đó sao chép vòng lặp nó chặn theo khối. Trong giả:

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

[Chỉnh sửa bởi Người hỏi] Ok, đây là cách nó trông giống trong C# (đó là chậm nhưng có vẻ như để làm việc Ok, và nó mang lại tiến bộ):

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

Sử dụng ít nhất một 100KB tốt hơn một bộ đệm 1MB. Điều này sẽ tăng tốc độ sao chép tập tin rất nhiều! –

+1

Bạn có 2 GB để chơi với ...;) Nghiêm túc, mặc dù, Aaron là đúng - bump lên bộ đệm đọc/ghi. – GalacticCowboy

6

Nếu bạn muốn viết mã, một cách bạn có thể tối ưu hóa là gửi tệp theo khối (như sử dụng MTOM). Tôi sử dụng phương pháp này để gửi xuống các tập tin khổng lồ từ một DataCenter xuống đến văn phòng của chúng tôi cho in ấn ..

Ngoài ra, kiểm tra các tiện ích TeraCopy nêu here ..

Các vấn đề liên quan