2013-04-17 22 views
16

Tôi có một thư mục chứa .ZIP files. Bây giờ, tôi muốn giải nén các tập tin ZIP vào các thư mục cụ thể bằng cách sử dụng C#, nhưng không sử dụng bất kỳ hội đồng bên ngoài hoặc .Net Framework 4.5.Làm thế nào để giải nén tất cả các tập tin .Zip từ thư mục bằng cách sử dụng C# 4.0 và không sử dụng bất kỳ Dll OpenSource?

Tôi đã tìm kiếm nhưng không tìm thấy giải pháp nào để giải nén tệp .zip bằng Framework 4.0 trở xuống.

Tôi đã thử GZipStream nhưng chỉ hỗ trợ tệp .gz chứ không phải tệp .zip.

+1

Bạn có thể tìm hiểu về định dạng zip và viết codec riêng nếu bạn chống lại thư viện của bên thứ ba và yêu xp quá nhiều = D – Sinatr

Trả lời

27

Đây là ví dụ từ msdn. System.IO.Compression.ZipFile được thực hiện chỉ cho rằng:

using System; 
using System.IO; 
using System.IO.Compression; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string startPath = @"c:\example\start"; 
      string zipPath = @"c:\example\result.zip"; 
      string extractPath = @"c:\example\extract"; 

      ZipFile.CreateFromDirectory(startPath, zipPath); 

      ZipFile.ExtractToDirectory(zipPath, extractPath); 
     } 
    } 
} 

Edit: xin lỗi, tôi bị mất rằng bạn đang lợi ích trong .NET 4.0 và dưới đây. Bắt buộc .NET framework 4.5 trở lên.

+5

tôi đã đề cập rằng tôi có khung 4.0 và không 4.5 xin lỗi! –

+3

@SHEKHAR SHETE, vâng xin lỗi. Tuy nhiên câu trả lời có thể hữu ích cho ai đó vì vậy tôi sẽ rời khỏi nó. –

1

ZipPackage có thể là nơi để bắt đầu. Đó là bên trong System.IO.Packaging và có sẵn trong .NET 4.0

Không ở bất kỳ đâu gần sự đơn giản của phương pháp .NET 4.5 đã đề cập ở trên, nhưng có vẻ như nó có thể làm những gì bạn muốn.

-1

Trong .net 4.0 Deflate và GZip không thể xử lý tệp Zip, nhưng bạn có thể sử dụng chức năng vỏ để giải nén tệp.

public FolderItems Extract() 
{ 
var shell = new Shell(); 
var sf = shell.NameSpace(_zipFile.Path); 
return sf.Items(); 
} 

Khi trích Chức năng được gọi là bạn có thể lưu folderItems trả về bởi

FolderItems Fits = Extract(); 
    foreach(var s in Fits) 
    { 
     shell.Namespace("TargetFolder").copyhere(s); 

    } 
0

.NET 3.5 có DeflateStream cho việc này. Bạn phải tạo cấu trúc cho thông tin trên các thư mục và như vậy, nhưng PKWare đã xuất bản thông tin này. Tôi đã viết một tiện ích giải nén và nó không đặc biệt nguy hiểm khi bạn tạo các cấu trúc cho nó.

12

Tôi đã có cùng một câu hỏi và tìm thấy một bài viết tuyệt vời và rất đơn giản để giải quyết vấn đề. http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/

bạn sẽ cần phải tham khảo thư viện COM được gọi là Microsoft Shell Controls Và Tự động hóa (Interop.Shell32.dll)

Mã (lấy ảnh hưởng từ các bài báo chỉ để bạn thấy cách đơn giản nó là) :

public static void UnZip(string zipFile, string folderPath) 
{ 
    if (!File.Exists(zipFile)) 
     throw new FileNotFoundException(); 

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

    Shell32.Shell objShell = new Shell32.Shell(); 
    Shell32.Folder destinationFolder = objShell.NameSpace(folderPath); 
    Shell32.Folder sourceFile = objShell.NameSpace(zipFile); 

    foreach (var file in sourceFile.Items()) 
    { 
     destinationFolder.CopyHere(file, 4 | 16); 
    } 
} 

khuyên đọc article- ông mang một explenation cho cờ 4 | 16

EDIT: sau vài năm mà ứng dụng của tôi, sử dụng ứng dụng này, đã chạy, tôi đã nhận được khiếu nại từ hai người dùng rằng tất cả các ứng dụng đột ngột ngừng hoạt động. có vẻ như chức năng CopyHere tạo ra các tệp/thư mục tạm thời và chúng chưa bao giờ bị xóa gây ra sự cố. Vị trí của các tệp này có thể được tìm thấy trong System.IO.Path.GetTempPath().

+1

Tôi thấy rằng vì một số lý do thời gian của các tập tin giải nén đã khác với thời gian của các tập tin gốc, kể từ khi các tập tin sao chép cho một số lý do đặt lại các giây. ví dụ: thời gian ban đầu 24/6/15 08:00:35 tệp được sao chép sẽ là: 24/6/15 08:00:00 Thông thường việc này không tạo sự khác biệt nhưng khách hàng đã chỉ ra cho tôi: -/ – TBD

+0

Đây thực sự là câu trả lời hàng đầu. Đơn giản, hoạt động trong .NET 4 và không yêu cầu thư viện bên ngoài. –

+0

Đây phải là câu trả lời được chấp nhận vì nó trả lời tình huống của OP. Tôi đang làm việc với 4.5 nên câu trả lời bình chọn cao nhất hiện tại phù hợp với tôi. – user1032613

0

tôi đã cùng một vấn đề và giải quyết nó bằng cách gọi thực thi 7-zip qua vỏ cmd từ C# mã, như sau,

string zipped_path = "xxx.7z"; 
string unzipped_path = "yyy"; 
string arguments = "e " + zipped_path + " -o" + unzipped_path; 

System.Diagnostics.Process process 
     = Launch_in_Shell("C:\\Program Files (x86)\\7-Zip\\","7z.exe", arguments); 

if (!(process.ExitCode == 0)) 
    throw new Exception("Unable to decompress file: " + zipped_path); 

Và nơi Launch_in_Shell(...) được định nghĩa là,

public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory, 
                 string FileName, 
                 string Arguments) 
{ 
     System.Diagnostics.ProcessStartInfo processInfo 
             = new System.Diagnostics.ProcessStartInfo(); 

     processInfo.WorkingDirectory = WorkingDirectory; 
     processInfo.FileName = FileName; 
     processInfo.Arguments = Arguments; 
     processInfo.UseShellExecute = true; 
     System.Diagnostics.Process process 
             = System.Diagnostics.Process.Start(processInfo); 

     return process; 
} 

Nhược điểm : Bạn cần cài đặt 7zip trong máy của bạn và tôi chỉ thử với các tệp ".7z". Hi vọng điêu nay co ich.

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