2013-04-17 18 views
16

Ho una cartella contenente .ZIP file. Ora, voglio estrarre i file ZIP in cartelle specifiche usando C#, ma senza utilizzare alcun assembly esterno o .Net Framework 4.5.Come decomprimere tutto il file. Zip dalla Cartella usando C# 4.0 e senza usare alcuna Dll OpenSource?

Ho cercato, ma non trovato alcuna soluzione per decomprimere i file * .zip utilizzando Framework 4.0 o inferiore.

Ho provato GZipStream, ma supporta solo file .gz e non .zip.

+1

È possibile conoscere il formato zip e scrivere il proprio codec se si è tanto contro le librerie di terze parti e si ama troppo xp = D – Sinatr

risposta

27

Ecco l'esempio da msdn. System.IO.Compression.ZipFile è fatto solo per questo:

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: dispiace, ho perso che sei interessi in .NET 4.0 e di seguito. Required .NET framework 4.5 e versioni successive.

+5

ho già detto che ho il framework 4.0 e non il 4,5, quindi scusate! –

+3

@SHEKHAR SHETE, si scusa. Tuttavia la risposta potrebbe essere utile per qualcuno, quindi la lascerò. –

1

ZipPackage potrebbe essere un punto di partenza. È all'interno di System.IO.Packaging e disponibile in .NET 4.0

Non da nessuna parte vicino alla semplicità del metodo .NET 4.5 sopra menzionato, ma sembra che possa fare quello che vuoi.

-1

In .net 4.0 Deflate e GZip non possono gestire i file Zip, ma è possibile utilizzare la funzione di shell per decomprimere i file.

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

Quando Funzione estratto si chiama è possibile salvare i FolderItems restituiti da

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

    } 
0

NET 3.5 ha un DeflateStream per questo. È necessario creare le strutture per le informazioni sulle directory e simili, ma PKWare ha pubblicato queste informazioni. Ho scritto un'utilità di decompressione e non è particolarmente onerosa una volta create le strutture per esso.

12

Ho avuto la stessa domanda e ho trovato un articolo fantastico e molto semplice che risolve il problema. http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/

è necessario fare riferimento alla libreria COM chiamato Controlli Microsoft Shell e Automazione (Interop.Shell32.dll)

Il codice (preso intatta dal articolo appena in modo da vedere quanto sia semplice) :

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); 
    } 
} 

raccomando di leggere l'articolo- egli porta un explenation per le bandiere 4 | 16

EDIT: dopo diversi anni che la mia app, che utilizza questo, è in esecuzione, ho ricevuto lamentele da due utenti che all'improvviso l'app ha smesso di funzionare. sembra che la funzione CopyHere crea file temporanei/cartelle e questi non sono mai stati eliminati e questo ha causato problemi. La posizione di questi file può essere trovata in System.IO.Path.GetTempPath().

+1

Ho scoperto che per qualche motivo il tempo dei file decompressi era diverso dal tempo dei file originali, poiché i file di copia per qualche motivo azzerano i secondi. ad esempio: ora originale 24/6/15 08:00:35 il file copiato sarà: 24/6/15 08:00:00 Generalmente questo non fa differenza, ma il cliente me lo ha fatto notare: -/ – TBD

+0

Questa dovrebbe essere la risposta migliore. Semplice, funziona in .NET 4 e non richiede librerie esterne. –

+0

Questa dovrebbe essere la risposta accettata perché ha risposto alla situazione dell'OP. Sto lavorando con 4,5 quindi la risposta di voto più alta attuale mi sta bene. – user1032613

0

Ho avuto lo stesso problema e risolto chiamando eseguibile 7-zip attraverso shell cmd dal codice C#, come segue,

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); 

E dove Launch_in_Shell(...) è definito come,

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; 
} 

Inconvenienti : Devi aver installato 7zip nella tua macchina e l'ho provato solo con i file ".7z". Spero che questo ti aiuti.

Problemi correlati