2008-08-20 37 views
12

Tôi đang tìm một cách mạnh mẽ để sao chép tệp qua chia sẻ mạng Windows có khả năng chịu được kết nối gián đoạn. Ứng dụng này thường được sử dụng trên các máy trạm không dây, di động ở các bệnh viện lớn và tôi cho rằng kết nối có thể bị mất trong giây lát hoặc trong vài phút tại một thời điểm. Các tệp có liên quan thường có kích thước khoảng 200KB - 500KB. Ứng dụng này được viết bằng VB6 (ugh), nhưng chúng ta thường xuyên sử dụng các cuộc gọi Windows DLL.Sao chép tập tin qua kết nối mạng gián đoạn

Cảm ơn!

Trả lời

5

Tôi không rõ vấn đề thực tế của bạn là gì, vì vậy tôi sẽ đưa ra một vài suy nghĩ.

  • Bạn có muốn bản sao có thể khởi động lại (với kích thước tệp nhỏ như vậy, có vẻ như đó không phải là một giao dịch lớn)? Nếu có, hãy xem CopyFileEx with COPYFILERESTARTABLE
  • Bạn có muốn bản sao có thể xác minh không? Có vẻ như bạn đã có bằng cách xác minh băm.
  • Bạn có muốn có hiệu suất tốt hơn không? Nó sẽ khó khăn, vì có vẻ như bạn không thể chạy bất cứ thứ gì trên máy chủ. Nếu không, TransmitFile có thể hữu ích.
  • Bạn chỉ muốn lửa và quên hoạt động? Tôi cho rằng bắn phá để cướp, hoặc TeraCopy hoặc một cái gì đó sẽ làm việc - nhưng có vẻ như một chút hacky với tôi.
  • Bạn có muốn biết khi nào mạng trở lại? IsNetworkAlive có câu trả lời của bạn.

Dựa trên những gì tôi biết cho đến nay, tôi nghĩ rằng pseudo-code sau đây sẽ là cách tiếp cận của tôi:

sourceFile = Compress("*.*"); 
destFile = "X:\files.zip"; 

int copyFlags = COPYFILEFAILIFEXISTS | COPYFILERESTARTABLE; 
while (CopyFileEx(sourceFile, destFile, null, null, false, copyFlags) == 0) { 
    do { 
    // optionally, increment a failed counter to break out at some point 
    Sleep(1000); 
    while (!IsNetworkAlive(NETWORKALIVELAN)); 
} 

Nén các tập tin đầu tiên giúp bạn tiết kiệm theo dõi các tập tin mà bạn đã sao chép thành công, và bạn cần khởi động lại cái gì. Nó cũng sẽ làm cho các bản sao đi nhanh hơn (kích thước tập tin nhỏ hơn tổng số, và kích thước tập tin duy nhất lớn hơn), tại các chi phí của một số sức mạnh CPU trên cả hai mặt. Một tập tin thực thi đơn giản có thể giải nén nó ở phía máy chủ.

5

Thử sử dụng BITS (Dịch vụ truyền tải thông minh nền). Đó là cơ sở hạ tầng mà Windows Update sử dụng, có thể truy cập thông qua API Win32 và được xây dựng đặc biệt để giải quyết vấn đề này.

Thông tin này thường được sử dụng để cập nhật ứng dụng nhưng sẽ hoạt động tốt trong mọi tình huống di chuyển tệp.

http://www.codeproject.com/KB/IP/bitsman.aspx

0

Làm thế nào về chỉ đơn giản gửi một hash sau hoặc trước khi bạn gửi các tập tin, và so sánh điều đó với các tập tin mà bạn nhận được? Điều đó nên ít nhất chắc chắn rằng bạn có một tập tin chính xác.

Nếu bạn muốn hết tất cả, bạn có thể thực hiện quy trình tương tự, nhưng đối với các phần nhỏ của tệp. Sau đó, khi bạn có tất cả các phần, hãy tham gia cùng họ trên đầu nhận.

+0

Đó chính xác là những gì mà BITS thực hiện. – TheSmurf

13

Tôi đã sử dụng Robocopy cho điều này với kết quả xuất sắc. Theo mặc định, nó sẽ thử lại sau mỗi 30 giây cho đến khi tệp được xem.

+0

Cảm ơn các đề xuất RoboCopy và CopyFileEx. CopyFileEx đặc biệt trông đầy hứa hẹn. Hiện tại, ứng dụng khách đang sử dụng [SHFileOperation] (http://msdn.microsoft.com/en-us/library/bb762164 (VS.85) .aspx) để thực hiện sao chép tệp thực. –

-1

SMS nếu tính năng này khả dụng.

1

Tôi đồng ý với Robocopy là giải pháp ...thats tại sao các tiện ích được gọi là "mạnh mẽ Copy File"

Tôi đã sử dụng Robocopy cho điều này với kết quả xuất sắc. Theo mặc định, nó sẽ thử lại sau mỗi 30 giây cho đến khi tệp được xem.

Và theo mặc định, một triệu lần thử lại. Điều đó sẽ rất nhiều cho kết nối liên tục của bạn.

Nó cũng có thể khởi động lại và bạn thậm chí có thể điều chỉnh chuyển đổi với khoảng cách giữa các gói tin bạn không muốn sử dụng tất cả băng thông như các chương trình khác đang sử dụng cùng một kết nối (/ IPG switch) ?.

0

Hm, dường như rsync hiện nó, và không cần máy chủ/daemon/cài đặt tôi nghĩ nó - chỉ $ rsync src dst.

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