2013-09-24 50 views
1

我在我的WCF服務中使用Ionic zip解壓縮由'client'上傳的文件。這些文件使用Ionic zip壓縮。但是,有一些情況下壓縮文件被'損壞' 。因爲我的代碼掃描整個文件夾以查找壓縮文件,所以會拋出異常,因爲它每次都會拾取相同的「損壞」壓縮文件。這會停止處理所有其他文件。以下代碼:忽略文件,如果它損壞

foreach (string filePath in Directory.GetFiles(ZippedFilesDestinationFolder)) 
{ 
    using (ZipFile zip1 = ZipFile.Read(filePath)) 
      { 
       foreach (ZipEntry e in zip1) 
       { 
        e.Extract(unpackdirectory, ExtractExistingFileAction.OverwriteSilently); 
       } 
      } 
} 

我想將損壞的文件移動到另一個文件夾並繼續提取文件夾中的其他壓縮文件。如何修改代碼以實現此目的?

+0

什麼*確切*是你得到的例外?它究竟在哪裏被拋出? –

回答

4

它停止了所有其他文件,因爲異常在循環內未處理,導致循環退出。在讀取Zipped文件的過程中添加Try/Catch將允許文件失敗,但仍允許處理下一個文件。

foreach (string filePath in Directory.GetFiles(ZippedFilesDestinationFolder)) 
{ 
    try 
    { 
     using (ZipFile zip1 = ZipFile.Read(filePath)) 
     { 
      foreach (ZipEntry e in zip1) 
      { 
       e.Extract(unpackdirectory, ExtractExistingFileAction.OverwriteSilently); 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
     /* Log ex here */ 
     /* Move corrupt file */ 
    } 
} 
+0

嘗試了try/catch塊。但仍然有同樣的錯誤。肯定有一些非常明顯的我失蹤了。 – user1550951

+2

@ user1550951是的,錯誤仍然會發生,但是現在您正在捕獲該異常,因此您可以將該文件移入catch塊中,並且可以繼續執行下一個循環迭代,而不是完全停止。你可能有「拋出中斷」設置,所以try-catch塊內的異常仍然會破壞調試器,這就是爲什麼你仍然會看到錯誤。或者你得到一個與解壓縮無關的錯誤(如文件正在使用),所以移動失敗,你需要[更新你的文章](http://stackoverflow.com/posts/18988534/edit)並告訴我們究竟是什麼例外說。 –

+0

@ScottChamberlain:'明顯的'事情是將損壞的文件移動到catch塊中的另一個位置。我記錄了錯誤,向用戶拋出了一個用戶友好的錯誤消息,但沒有將該文件移動到另一個文件夾。 – user1550951