2014-06-12 30 views
4

所以我一直在構建一個可重用的類,它會處理遞歸拷貝目錄一,到另一個目錄。的文件夾結構是:遞歸到無窮遠,沒有準備好

  • 根(D:\Arrigotti
  • 源(C:\inetpub\wwwroot
  • 目的地(D:\Arrigotti\Backup
  • 存檔(D:\Arrigotti\Archive

那些是關鍵區域,用於爲了簡單起見,我將示例代碼省略一些驗證/錯誤處理。

public static class FileSystem 
{ 
    public static void CopyDirectory(string source, string destination) 
    { 
      DirectoryInfo directory = new DirectoryInfo(source); 
      DirectoryInfo[] directories = directory.GetDirectories(); 
      foreach(DirectoryInfo dir in directories) 
      { 
       Console.WriteLine(@"Found Directory: {0}", dir.FullName); 
       if(Directory.Exists(Path.Combine(destination, dir.Name))) 
       { 
         Console.WriteLine(@"Attempting to write directory..."); 
         Directory.CreateDirectory(Path.Combine(destination, dir.Name)); 
         Console.WriteLine(@"Created Directory: {0}", dir.Name); 
       } 

       CopyDirectory(dir.FullName, Path.Combine(destination, dir.Name)); 
       FileInfo[] files = dir.GetFiles(); 
       foreach(FileInfo file in files) 
       { 
         Console.WriteLine(@"Found: {0}", file.FullName); 
         Console.WriteLine(@"Attempting to copy..."); 
         file.CopyTo(Path.Combine(destination, file.Name), true); 
       } 
      } 
    } 
} 

我認爲這部分是相當準確和工作。但是,我的問題出現在我的電話中。

public static class Backup 
{ 
    public static void Save() 
    { 
      string[] drives = Directory.GetLogicalDrives(); 
      foreach(string drive in drives) 
      { 
       DriveInfo diagnose = new DriveInfo(drive); 
       if(diagnose.VolumeLabel == @"Backup" && diagnose.DriveType == DriveType.Fixed) 
       { 
        CopyDirectory(
          ConfigurationManager.AppSettings[@"Source"], 
          ConfigurationManager.AppSettings[@"Destination"]); 
       } 
      } 
     } 
} 

的代碼運行時,它看起來像在這一點上一帆風順,它完成五明百個目錄被複制,然後它隨機拋出異常的Web站點的(我離開錯誤處理了,爲了簡單起見,但這是錯誤)。

IOException:設備未準備好。

它隨機停止閱讀

我不完全知道爲什麼會發生,任何的建議是了不起的。

+2

我訪問的驅動器已準備就緒這與我自己的備份應用程序。我在複製操作本身上放了一個信號燈,之後一切都很好。 –

+0

我在CopyDirectory中發現的是,如果目錄中的任何文件導致異常,則會跳過剩餘的文件,並使目標驅動器處於不確定狀態。 –

+0

@GayotFow我認爲這就是發生了什麼,你應該將其作爲答案。這對未來的訪客來說非常有用。這確實是一個奇怪的錯誤。 – Greg

回答

2

使用內置的方法肯定是比較合適的位置

Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(source,destination,true); 

然而,這不是問題的心臟。問題在於何時檢查每個驅動器。具體而言,請求DirectoryInfo上的.VolumeLabel。您可以在MSDN上閱讀關於此問題的一些背景信息:http://msdn.microsoft.com/en-us/library/system.io.driveinfo.volumelabel(v=vs.110).aspx

它發生故障的原因是,如果檢查驅動器,則必須準備好。有時它是沒有準備好,當它在這一點上訪問,你會得到一個異常

IOException - An I/O error occurred (for example, a disk error or a drive was not ready).

爲了解決這個問題,確保當diagnose.isReady

public static void Save() 
{ 
    string[] drives = Directory.GetLogicalDrives(); 
    foreach(string drive in drives) 
    { 
     DriveInfo diagnose = new DriveInfo(drive); 
     if(diagnose.IsReady && diagnose.VolumeLabel == @"Backup" && diagnose.DriveType == DriveType.Fixed) 
       ^^Make sure the drive is ready before examining properties 
     { 
      CopyDirectory(
       ConfigurationManager.AppSettings[@"Source"], 
       ConfigurationManager.AppSettings[@"Destination"]); 
     } 
    } 
} 
3

我會建議只使用內置的FileSystem.CopyDirectory方法,它可以在不使用自定義代碼的情況下正確處理目錄複製。

+0

不幸的是,即使採用這種方法,它仍然會出現相同的錯誤,它似乎試圖在完成後讀取不正確的驅動器。 – Greg