2012-08-08 6 views
6

पर सुरक्षित रूप से फ़ाइलों की प्रतिलिपि बनाएँ हमारे पास नेटएप NAS फाइलर है जो समय-समय पर विफल रहता है, यह सुनिश्चित नहीं है कि यह नेटवर्क समस्याओं, भारी भार या फ़ाइलर पर निर्भर करता है; बात यह है कि सामान्य System.IO.File.Copy(...) कमांड कभी-कभी अप्रत्याशित रूप से विफल रहता है, जबकि यह एक मिनट पहले काम करता था और एक मिनट बाद फिर से काम करता है ... फाइलर सीआईएफएस फाइल सिस्टम के साथ काम कर रहा है।NAS Filer

System.IO.IOException:: निर्दिष्ट नेटवर्क नाम अब उपलब्ध नहीं है

मेरी log4net लॉगफ़ाइल में

मैं अपवाद देखें। System.IO .__ Error.WinIOError (Int32 errorCode, स्ट्रिंग maybeFullPath) ... पर

नेटवर्क टीम अनिश्चित है कि क्या होता है और यही कारण है, मैं अब अगर मैं कॉपी करने के लिए एक सरल ट्राई/पुन: प्रयास करें प्रणाली को लागू कर सकते हैं सोच रहा हूँ फ़ाइल और विफलता के मामले में प्रतिलिपि पुनः प्रयास करें, यह संभवतः सिस्टम.आईओ.फाइल.कॉपी को सीआईएफएस स्टोरेज के लिए डिज़ाइन नहीं किया गया था लेकिन सामान्य एनटीएफएस ड्राइव या स्थिर नेटवर्क स्टोरेज के लिए बनाया गया था।

क्या प्रतिलिपि बनाने के लिए उपयुक्त सामान्य पैटर्न या .NET कक्षाएं हैं और को फिर से प्रयास करें या क्या मुझे बस निम्नलिखित छद्म कोड में एक दृष्टिकोण का उपयोग करना चाहिए?

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() 'Win32 [' CopyFile'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851.aspx) फ़ंक्शन पर उबाल जाता है । तो मैं उस चीज को कोड करता हूं जो बार-बार उपयोग करता है और देखता है कि यह विफल रहता है या नहीं। मुझे लगता है कि आप एक बड़ी समस्या पर एक सॉफ्टवेयर बैंड-सहायता डालने की कोशिश कर रहे हैं। –

+1

एक 'पिंग-होस्ट होस्टनाम' सेट अप करें और उसे फ़ाइल में लॉग ऑन करें। इसे कुछ घंटों तक चलने दें और फिर टाइमआउट देखें। यह आपको बताएगा कि समस्या नेटवर्क से संबंधित है या नहीं। अभी भी डिवाइस के साथ एक समस्या हो सकती है, लेकिन कम से कम आप .NET समस्या को रद्द कर सकते हैं। –

+0

मुझे वह लूप पसंद है। पकड़ने में एक छोटी सी प्रतीक्षा संभव है। – Paparazzi

उत्तर

1

सप्ताह और अनुसंधान, परीक्षण और दर्द मैं अंत में एक काम कर समाधान पाया है लगते हैं के सप्ताह के बाद, Microsoft Robocopy command के आह्वान के साथ System.IO.File.Copy विधि है जो जीत सर्वर में उपलब्ध है 2008 R2 की जगह करने का फैसला किया है और पहले से अच्छी तरह से काम करने के लिए लग रहा था प्रयत्न। यह मुझे आरामदायक बनाता है कि मैं पहिया को पुनर्निर्मित नहीं कर रहा हूं लेकिन मेरी जरूरतों के लिए बिल्कुल तैयार की गई एक परीक्षण तकनीक का उपयोग कर रहा हूं। वैसे भी आपके उत्तरों और टिप्पणियों के लिए सभी को धन्यवाद।

2

मेरे लिए समान हैपेंस। मेरे पास पुराना NAS Server है और समय-समय पर Windows shows an error telling me that the drive is not accessible anymore है।
प्रबंधन करने के लिए file copy process हो सकता है आप इस्तेमाल कर सकते हैं बजाय CopyFileEx (Windows API से) के रूप में अगले नमूने में बताया गया:

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 
} 

एक more extensive description in MSDN Magazine नहीं है।

+1

यह एक विचार हो सकता है, धन्यवाद! मेरी प्रक्रिया एक सर्वर पर विंडोज अनुसूचित कार्य द्वारा ट्रिगर किया गया एक कंसोल एप्लिकेशन है, इसलिए इसे देखने के लिए कोई उपयोगकर्ता नहीं है और मुझे प्रगति पट्टी या रद्द बटन जैसे फीडबैक की आवश्यकता नहीं है, लेकिन यह वैसे भी काम करता है, यह सब बेहतर होगा प्रयत्न। –

+1

यदि आपके पास क्या हो रहा है, इस पर नियंत्रण है, तो हो सकता है कि आप स्वचालित रूप से उन फ़ाइलों की प्रतिलिपि बना सकें जो पहले प्रयास में समस्याग्रस्त थे और पुनः प्रयास करने के लिए एक घंटा प्रतीक्षा करें। –

संबंधित मुद्दे