2013-02-10 31 views
15

我使用下面的代碼提取所有文件的文件夾在使用System.IO.Compression提取文件的過程中強制替換現有文件?

 using (ZipArchive archive = new ZipArchive(zipStream)) 
     { 
      archive.ExtractToDirectory(location); 
     } 

在但若然後一個文件存在,它拋出一個異常。是否有任何方法可以告訴Compression API來替換現有的文件。

我找到了一個辦法是先把所有的文件名,然後檢查文件是否存在,並將其刪除。但這對我來說是非常昂貴的。

回答

37

我已經創建了一個擴展不需要 檢查。它的任何評論完善可以理解的,

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      if (file.Name == "") 
      {// Assuming Empty for Directory 
       Directory.CreateDirectory(Path.GetDirectoryName(completeFileName)); 
       continue; 
      } 
      file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+0

這就像一個魅力。 – Ravia 2015-08-14 08:49:56

+0

這可能使用ZipFile內置類嗎? – Pedro77 2017-12-18 19:55:00

2

您可以將文件解壓到一些臨時目錄和不是複製與 「File.Copy」文件與ovveride選項忠於你的目標目錄

我知道,這不是一個完美的解決方案,但這樣一來,你如果文件存在

+0

我也有這個提示在我的腦海,但它是非常昂貴的我。 – user960567 2013-02-10 06:33:43

+0

我想你沒有其他選擇,但是使用了其他的框架 – 2013-02-10 06:40:31

11

該代碼將不會拋出異常,當該文件夾是不存在的,而不是它會創建文件夾。

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      string directory = Path.GetDirectoryName(completeFileName); 

      if (!Directory.Exists(directory)) 
       Directory.CreateDirectory(directory); 

      if (file.Name != "") 
       file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+3

不作爲複製貓 – FrostyFire 2015-06-03 16:37:05

+2

JABFreeware,如@ user960567說:「它的任何評論完善可以理解的,」我只需添加幾行代碼,以防止拋出異常! 如果(!Directory.Exists(目錄)) Directory.CreateDirectory(目錄); – Mohy66 2016-02-16 06:13:33

+0

Coooommmmmmmmmmeennnnnn沒有回答。如果你評論他會得到通知,並且可以編輯他的代碼:) – FrostyFire 2016-02-16 23:10:10

相關問題