2012-08-08 28 views
6

chúng tôi có một trình tải NetApp NAS mà theo thời gian dường như không thành công, không chắc chắn nếu điều này phụ thuộc vào các vấn đề mạng, tải nặng hoặc chính Filer; điều này là bình thường System.IO.File.Copy(...) lệnh thất bại đôi khi bất ngờ trong khi nó làm việc một phút trước và hoạt động trở lại một phút sau khi ... filer đang làm việc với hệ thống tập tin CIFS.Sao chép tập tin an toàn trên NAS Filer

vào logfile Log4Net của tôi, tôi thấy ngoại lệ:

System.IO.IOException: Tên mạng chỉ định không còn sẵn. tại System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) ...

đội mạng là không chắc chắn những gì xảy ra và tại sao, bây giờ tôi đang suy nghĩ nếu tôi có thể thực hiện một hệ thống thử/retry đơn giản để sao chép các tập tin và thử lại bản sao trong trường hợp thất bại, nó có thể có thể là System.IO.File.Copy không được thiết kế cho kho CIFS nhưng đối với ổ đĩa NTFS bình thường hoặc lưu trữ mạng ổn định.

Có các mẫu phổ biến hoặc lớp .NET phù hợp để thực hiện việc này sao chép và thử lại hoặc tôi chỉ nên sử dụng cách tiếp cận như trong mã giả sau đây?

while(!copied && count <5) 
{ 
    count++; 

    try 
    { 
    //here copy the file 
    ... 

    //if no exception copy was ok 
    copied = true; 
    } 
    catch 
    { 
    if(count >= 5) 
    { 
     // Log that retry limit has been reached... 
    } 
    else 
    { 
     // make thread to wait for some time, 
     // waiting time can be in function of count or fixed... 
    } 
    } 
} 
+2

'System.IO.File.Copy()' tóm tắt chức năng Win32 ['CopyFile'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851.aspx) . Vì vậy, tôi sẽ mã lên một cái gì đó mà sử dụng nhiều lần và xem nếu nó không thành công là tốt. Tôi nghĩ bạn đang cố gắng đưa một băng trợ phần mềm vào một vấn đề lớn hơn. –

+1

Thiết lập một tên máy chủ 'ping -t' và đăng nhập nó vào một tập tin. Hãy để nó chạy trong một vài giờ sau đó tìm thời gian chờ. Điều đó sẽ cho bạn biết nếu vấn đề là mạng liên quan. Vẫn có thể là một vấn đề với chính thiết bị, nhưng ít nhất bạn có thể loại trừ một vấn đề .NET. –

+0

Tôi thích vòng lặp đó. Có thể đặt một chờ đợi nhỏ trong bắt. – Paparazzi

Trả lời

1

sau nhiều tuần và tuần nghiên cứu, thử nghiệm và đau Tôi cuối cùng dường như đã tìm ra giải pháp làm việc, đã quyết định thay thế phương thức System.IO.File.Copy bằng cách gọi số Microsoft Robocopy command có sẵn trong Win Server 2008 R2 và dường như hoạt động tốt từ lần đầu tiên thử. Điều này làm cho tôi thoải mái rằng tôi không sáng tạo lại bánh xe nhưng sử dụng một công nghệ được kiểm tra được thiết kế chính xác cho nhu cầu của tôi. cảm ơn tất cả mọi người cho câu trả lời và bình luận của bạn anyway.

2

Hốc hốc tương tự với tôi. Tôi đã cũ NAS Server và theo thời gian Windows shows an error telling me that the drive is not accessible anymore.
Quản lý file copy process có lẽ bạn có thể sử dụng thay vì CopyFileEx (từ Windows API) như thể hiện trong các mẫu tiếp theo:

public class SecureFileCopy 
{ 
    public static void CopyFile(FileInfo source, FileInfo destination, 
     CopyFileOptions options, CopyFileCallback callback, object state) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     if (destination == null) 
      throw new ArgumentNullException("destination"); 
     if ((options & ~CopyFileOptions.All) != 0) 
      throw new ArgumentOutOfRangeException("options"); 

     new FileIOPermission(
      FileIOPermissionAccess.Read, source.FullName).Demand(); 
     new FileIOPermission(
      FileIOPermissionAccess.Write, destination.FullName).Demand(); 

     CopyProgressRoutine cpr = callback == null ? 
      null : new CopyProgressRoutine(new CopyProgressData(
       source, destination, callback, state).CallbackHandler); 

     bool cancel = false; 
     if (!CopyFileEx(source.FullName, destination.FullName, cpr, 
      IntPtr.Zero, ref cancel, (int)options)) 
     { 
      throw new IOException(new Win32Exception().Message); 
     } 
    } 

    private class CopyProgressData 
    { 
     private FileInfo _source = null; 
     private FileInfo _destination = null; 
     private CopyFileCallback _callback = null; 
     private object _state = null; 

     public CopyProgressData(FileInfo source, FileInfo destination, 
      CopyFileCallback callback, object state) 
     { 
      _source = source; 
      _destination = destination; 
      _callback = callback; 
      _state = state; 
     } 

     public int CallbackHandler(
      long totalFileSize, long totalBytesTransferred, 
      long streamSize, long streamBytesTransferred, 
      int streamNumber, int callbackReason, 
      IntPtr sourceFile, IntPtr destinationFile, IntPtr data) 
     { 
      return (int)_callback(_source, _destination, _state, 
       totalFileSize, totalBytesTransferred); 
     } 
    } 

    private delegate int CopyProgressRoutine(
     long totalFileSize, long TotalBytesTransferred, long streamSize, 
     long streamBytesTransferred, int streamNumber, int callbackReason, 
     IntPtr sourceFile, IntPtr destinationFile, IntPtr data); 

    [SuppressUnmanagedCodeSecurity] 
    [DllImport("Kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)] 
    private static extern bool CopyFileEx(
     string lpExistingFileName, string lpNewFileName, 
     CopyProgressRoutine lpProgressRoutine, 
     IntPtr lpData, ref bool pbCancel, int dwCopyFlags); 
} 

public delegate CopyFileCallbackAction CopyFileCallback(
    FileInfo source, FileInfo destination, object state, 
    long totalFileSize, long totalBytesTransferred); 

public enum CopyFileCallbackAction 
{ 
    Continue = 0, 
    Cancel = 1, 
    Stop = 2, 
    Quiet = 3 
} 

[Flags] 
public enum CopyFileOptions 
{ 
    None = 0x0, 
    FailIfDestinationExists = 0x1, 
    Restartable = 0x2, 
    AllowDecryptedDestination = 0x8, 
    All = FailIfDestinationExists | Restartable | AllowDecryptedDestination 
} 

Có một more extensive description in MSDN Magazine.

+1

điều này có thể là một ý tưởng, cảm ơn! quá trình của tôi là một ứng dụng giao diện điều khiển được kích hoạt bởi tác vụ Windows Scheduled trên máy chủ nên không có người dùng xem nó và tôi không cần phản hồi như thanh tiến trình hoặc nút hủy, nhưng nó hoạt động tốt hơn, sẽ cung cấp cho nó thử. –

+1

Nếu bạn đã kiểm soát những gì đang xảy ra, có thể bạn có thể tự động đặt bản sao của những tệp đó có vấn đề trong lần thử đầu tiên và chờ một giờ để thử lại. –

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