2013-09-24 37 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