2013-02-10 27 views
15

Tôi đang sử dụng đoạn mã sau để giải nén tất cả các file trong một thư mụcThay thế mạnh mẽ các tệp hiện có trong khi trích xuất tệp bằng System.IO.Compression?

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

Nhưng nếu một tập tin tồn tại sau đó nó ném một ngoại lệ. Có cách nào để nói với API nén để thay thế các tệp hiện có.

Tôi đã tìm thấy một cách là nhận tất cả tên tệp trước rồi kiểm tra xem tệp có tồn tại hay không và xóa tệp đó. Nhưng điều này bằng cách nào đó rất tốn kém đối với tôi.

Trả lời

37

Tôi đã tạo tiện ích mở rộng. bất kỳ bình luận cho nó cải thiện sẽ được đánh giá cao,

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

Điều này hoạt động như một sự quyến rũ. – Ravia

+0

Có thể sử dụng lớp nội trang ZipFile này không? – Pedro77

2

Bạn có thể trích xuất các file đối với một số thư mục tạm và hơn sao chép tập tin với "File.Copy" với các tùy chọn ovveride đúng với thư mục đích của bạn

Tôi biết rằng nó không phải là một giải pháp hoàn hảo, nhưng cách này bạn không cần phải kiểm tra xem tệp có tồn tại

+0

Tôi cũng có mẹo này trong đầu nhưng rất tốn kém đối với tôi. – user960567

+0

Tôi nghĩ bạn không có lựa chọn nào khác, ngoại trừ sử dụng khung công tác khác –

11

Mã này sẽ không ném ngoại lệ khi các thư mục không tồn tại, thay vào đó nó sẽ tạo ra các thư mục.

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

không phải là một bản sao con mèo – FrostyFire

+2

JABFreeware, như @ user960567 cho biết "bất kỳ bình luận nào để cải thiện nó sẽ được đánh giá cao", tôi chỉ thêm vài dòng để ngăn chặn ném ngoại lệ! nếu (! Directory.Exists (thư mục)) Directory.CreateDirectory (thư mục); – Mohy66

+0

Coooommmmmmmmmmeennnnnnt không trả lời. Nếu bạn nhận xét anh ta được thông báo và có thể chỉnh sửa mã của mình :) – FrostyFire

Các vấn đề liên quan