2010-03-09 56 views
8

Cố gắng trích xuất các tệp vào một thư mục đã cho bỏ qua đường dẫn trong tệp nén nhưng dường như không có cách nào.DotNetZip: Cách trích xuất tệp, nhưng bỏ qua đường dẫn trong tệp zipfile?

Điều này có vẻ là một yêu cầu khá cơ bản cho tất cả các công cụ tốt khác được triển khai trong đó.

Tôi đang thiếu gì?

code đang -

using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath)) 
{ 
    zf.ExtractAll(appPath); 
} 
+0

Tôi đang tìm kiếm một giải pháp tương tự nhưng tôi muốn chỉ loại bỏ các bước đầu tiên của tất cả các nội dung file ... ví dụ như/my giải pháp/file/file1.txt trở thành/tệp/file1.txt. Bất kỳ tài nguyên nào cho điều này? – atwellpub

Trả lời

12

Bạn sẽ cần phải loại bỏ phần thư mục của tên tập tin ngay trước khi giải nén ...

using (var zf = Ionic.Zip.ZipFile.Read(zipPath)) 
{ 
    zf.ToList().ForEach(entry => 
    { 
     entry.FileName = System.IO.Path.GetFileName(entry.FileName); 
     entry.Extract(appPath); 
    }); 
} 
+0

doh! không nghĩ về điều đó :) cảm ơn nhiều – Kumar

+0

Tôi nhận được một lỗi nói rằng "Tài sản hoặc chỉ mục là chỉ đọc" ...... Trợ giúp! – pek

+0

Tính năng này có hoạt động với các thư mục lồng nhau không? –

1

Điều đó sẽ thất bại nếu có 2 file với nhau tên tệp. Ví dụ files \ additionalfiles \ file1.txt temp \ file1.txt

tập đầu tiên sẽ được đổi tên thành file1.txt trong file zip và khi tập tin thứ hai đang cố gắng để được đổi tên thành một ngoại lệ được ném nói rằng một mục có cùng khóa đã tồn tại

18

Mặc dù bạn không thể chỉ định mục đó cho một cuộc gọi cụ thể tới Extract() hoặc ExtractAll(), lớp ZipFile có trường FlattenFoldersOnExtract. Khi được đặt thành true, nó sẽ làm phẳng tất cả các tệp được trích xuất thành một thư mục:

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract; 
zip.FlattenFoldersOnExtract = true; 
zip.ExtractAll(); 
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract; 
+4

Đây phải là câu trả lời được chấp nhận ([DontNetZip doc] (http://dotnetzip.herobo.com/DNZHelp/html/4970c6e8-c169-3ecc-b5f2-8ba9b354c51d.htm)). Câu trả lời khác là một cách giải quyết: nó đổi tên tệp trong zip trước khi giải nén nó. –

0

Bạn có thể sử dụng quá tải lấy luồng làm tham số. Bằng cách này, bạn có toàn quyền kiểm soát đường dẫn nơi các tệp sẽ được trích xuất.

Ví dụ:

using (ZipFile zip = new ZipFile(ZipPath)) 
{ 
    foreach (ZipEntry e in zip) 
    { 
     string newPath = Path.Combine(FolderToExtractTo, e.FileName); 

     if (e.IsDirectory) 
     { 
      Directory.CreateDirectory(newPath); 
     } 
     else 
     { 
      using (FileStream stream = new FileStream(newPath, FileMode.Create)) 
      e.Extract(stream); 
     } 
    } 
} 
Các vấn đề liên quan