Home Page Home Page Articoli Comprimere e decomprimere files ZIP con .NET e #ZipLib

Comprimere e decomprimere files ZIP con .NET e #ZipLib

Visualizzare il contenuto di un file Zip da una applicazione vi sembra una Mission Impossibile? Oppure la vostra azienda ha fatto un mutuo per pagare il componente che vi aiuta nel lavoro? Ecco un articolo che parla della libreria sharpZipLib, libreria Open Source per la gestione dei formati compressi.
Autore: Giovanni Ferron Livello:
Introduzione
In applicazioni enterprise molte volta capita che sia necessario dover lavorare con formati di compressione. Per far ciò abbiamo bisogno degli strumenti adatti, soprattutto che non costino uno sproposito, questo strumento è SharpZipLib, strumento Open Source (quindi gratuito) e con molte potenzialità, infatti possiamo lavorare oltre che con il formato Zip anche con i formati GZip, Tar e BZip2.
In questo articolo daremo un'introduzione alle possibili applicazioni del componente, le più comuni, estrazione contenuto file zip e creazione di un archivio.


Download e Installazione
Il componente lo potete scaricare al seguente indirizzo:
http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx ">Download #ZipLib
troverete le seguenti opzioni: Codice e esempi, assembly già compilato con relativi script di installazione e il file di help.
In questo caso consiglio di scaricare la versione con l'assembly, mentre gli amanti dell'Open possono scaricarsi il codice e compilare la propria versione.
Una volta scaricato e estratto il contenuto del file zip, non dobbiamo far altro che eseguire il programma dos installGAC.bat da prompt dei comandi di Visual Studio .NET, che installerà il componente nella GAC del nostro PC, per controllare che l'installazione sia andata a buon fine, basta andare nella lista degli assembly registrati nell?applicativo di configurazione del .NET Framework, che si trova negli stumenti di amministrazione, e cercare ICSharpCode.SharpZipLib.




Contenuto file Zip
Cominciamo la nostra carrellata delle feature del componente con il visualizzare il contenuto di un file zip. Apriamo il nostro Visual Studio .NET (o il nostro editor preferito) e creiamo una nuova Windows application. Tra le References del nostro progetto aggiungiamo l'assembly ICSharpCode.SharpZipLib.



Dalla finestra di dialogo che si apre clicchiamo sul tasto browse e cerchiamo la DLL sul nostro PC(ICSharpCode.SharpZipLib.dll), dopo di che clicchiamo sul tasto OK.





Ora siamo pronti ad utilizzare nel nostro progetto il componente. A questo punto creiamo una nuova form o una nuova classe e importiamo il namespace:


using ICSharpCode.SharpZipLib.Zip;


Ora dobbiamo elencare il contenuto del nostro file. E' da premettere che il componente rappresenta un file Zip come un oggetto ZipFile, e l'elenco degli elementi al suo interno si chiamano Entry. Quindi non dobbiamo far altro che creare un oggetto ZipFile, dopo di che ciclare sulla collection delle entry, quindi:

Creo l'oggetto ZipFile passando come unico argomento il path completo del file zip:


ZipFile zFile = new ZipFile(strNomefile);


Dopo di che creo un ciclo sulla collection delle entry del mio file.


foreach(ZipEntry objZip in zFile)
{
. . .

}


A questo punto all'interno del ciclo ricaverò il nome della mia entry e lo stampo a video:


MessageBox.Show(objZip.Name);


Oltre al nome ho tutta un'altra serie di proprietà, tra cui la dimensione del file e la data di creazione della entry.

ATTENZIONE: Le directory sono considerate come entry, quindi oltre ai file vi verranno restituite anche le directory, per evitare questo si dovrà fare un if che controllerà che nel nome della entry esista un nome di un file:


string fileName = Path.GetFileName(objZip.Name);

if(fileName != string.Empty)
{

. . .

}



Estrarre il contenuto di un file Zip
Ora che siamo riusciti a vedere il contenuto di un file Zip, estraiamo il suo contenuto all'interno di una directory da noi scelta. Per poter compattare un file zip, il componente ci offre l'oggetto ZipInputStream che come argomento vuole lo strema del file Zip.


//creo un nuovo oggetto Input stream per l'estrazione
ZipInputStream s = new ZipInputStream(File.OpenRead(strNomefile));


A questo punto devo ciclare sul file e per ogni entry aprire uno stream di byte e creare il file. Per poter far ciò ci viene fornito un metodo .GetNextEntry() che ci ritorna la entry successiva a quella attuale, quindi dovremo fare un controllo che nel momento in cui non esisterà più la entry successiva usciremo dal ciclo


//variabile di controllo
bool myControl = true;
//ciclo fino a quando non trovo una entry
Do
{
//nel caso non esista una entry successiva esco dal ciclo
theEntry = s.GetNextEntry();
if(theEntry == null)
{
myControl = false;
break;
}

. . .

}
while(myControl);


Ora all'interno del mio ciclo devo fare una serie di controlli prima di estrarre il file, primo fra tutti se la entry è un file e non una directory, dopo di che controllare che la directory del file esista, nel caso contrario crearla.


//Imposto la directory di estrazione che è la directory da me scelta
string strDestinationPath = "c:\\";
//Ricavo il nome della direcory della entry
string directoryName = Path.GetDirectoryName(theEntry.Name);
//Ricavo il nome del file della entry
string fileName = Path.GetFileName(theEntry.Name);
//controllo che sia un file e non una directory
if(fileName != String.Empty && strDestinationPath != "")
{
//se non esiste la directory la creo
if(!Directory.Exists(strDestinationPath + "\\" + directoryName))
{
Directory.CreateDirectory(strDestinationPath + "\\" + directoryName);
}

. . .

}


Ora che abbiamo fatto tutti I controlli del caso, all'interno del nostro if apriamo uno StreamWriter e cicliamo sul buffer della entry, e scriviamo byte per byte nel nostro Stream:


//apro un oggetto stream writer per creare il nuovo file
FileStream streamWriter = File.Create(strDestinationPath + "\\" + directoryName + "\\" + fileName);

int size = 2048;
byte[] data = new byte[2048];

//ciclo sul buffer della entry fino a quando non è vuoto
while(true)
{
size = s.Read(data, 0, data.Length);
if(size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}

}
//chiudo lo stream writer
streamWriter.Close();


Al termine del ciclo troveremo all'interno della cartella di partenza da noi selezionata il file Zip scompattato.

Creare file zip
A questo punto non ci rimane altro che analizzare come creare un file zip, che rispetto all'estrazione è molto più semplice. Come per l'estrazione c'era un oggetto incaricato dell'operazione, anche per la creazione di un file archivio dobbiamo creare un oggetto ZipOutputStream:


//Creo l'oggetto ZipOutputStream per la creazione del file zip
//e creo anche il file
ZipOutputStream s = new ZipOutputStream(File.Create(strZipFileName));


Dopo di che devo aprire un FileStream per leggere i byte del file:


//apro un file stream sul file
FileStream fs = File.OpenRead(strNomeFile);
//creo l'array di byte
byte[] buffer = new byte[fs.Length];
//Leggo il buffer
fs.Read(buffer, 0, buffer.Length);


Ora dobbiamo creare una nuova entry nel nostro file zip, e scrivere il buffer dei dati:


//creo una nuova entry
ZipEntry myEntry = new ZipEntry(strNomeFile);
//Aggiungo la entry al file zip
s.PutNextEntry(myEntry);
//Scrivo il buffer
s.Write(buffer, 0, buffer.Length);


Conclusioni
In questo articolo abbiamo visto come possiamo gestire I file Zip con .NET, con l'aiuto di un piccolo componente Open Source. Come abbiamo visto il suo utilizzo non è così immediato, ma essendo open source ci permette di risparmiare qualche euro, in cambio di poche righe di codice. Inoltre il componente è alla versione 0.61, quindi ce ne sarà ancora di strada fino alla release 1.0, non potrà che migliorare.
Voto medio articolo: 4.4 Numero Voti: 9

File allegati


117_ziplib.zip (207 Kbyte)
Giovanni Ferron

Giovanni Ferron

Sviluppatore dal 2000. Collabora a grandi progetti nella creazione di portali e intranet aziendali. Attualmente ha lasciato la terra natia per una nuova avventura in Australia, dove lavora come programmatore web per una emittente radio Australiana. Profilo completo

Articoli collegati

Garantire l'univocità di una colonna ammettendo valori NULL multipli
Chi sviluppa in ambito professionale o per puro diletto prima o poi si troverà ad affrontare tematiche nuove ed avvincenti. In questo articolo cercherò di illustrare tre tecniche con i relativi pregi e difetti per permettere con SQL Server di garantire l'univocità di una colonna senza alcuna limitazione sui valori NULL
Autore: Lorenzo Benaglia | Difficoltà:
Integrare Crystal Reports con una Windows Form
Ecco come sfruttare in modo semplice e rapido le funzionalità offerte dal tool di reportistica Crystal Reports di Business Objects all'interno di una Windows Form .NET, dalla crazione del Report al Binding dei dati.
Autore: Matteo Raumer | Difficoltà: | Commenti: 2
Il Logging con Integration Services 2005
Perchè si è bloccata la mia applicazione ? Che errori si sono verificati ? Perchè il flusso d'esecuzione non procede nel modo corretto ? Cerchiamo di capire come possono esserci utili le funzionalità di logging offerte da SQL Server e gli Integration Services per rendere più affidabili e consistenti le nostre applicazioni.
Autore: Alessandro Alpi | Difficoltà: | Commenti: 3
Utilizzare i SQL Server Agent Proxies con i Package SSIS
Chi utilizza frequentemente i SSIS Packages e accede a risorse esterne a SQL Server non può fare a meno di conoscere ed utilizzare i Proxy Account (o SQL Server Agent Proxies). Vediamo che cosa sono e come si utilizzano in modo proficuo.
Autore: Alessandro Alpi | Difficoltà: | Commenti: 4
SQL Server 2005 - La Import/Export utility
Chi lavora sui Database si ritrova quasi quotidianamente a dover importare o esportare dati. SQL Server 2005 agevola notevolmente il compito tramite l'Import/Export Utility (ex DTS Import/Export di SQL 2000). Vediamo come funziona.
Autore: Alessandro Alpi | Difficoltà: | Commenti: 14
Visual Studio 2005 Team System for Database Professionals
Scopriamo questo nuovo e potente Tool della famiglia Visual Studio 2005 Team System per creare, sviluppare, testare e gestire con più facilità e flessibilità i database di SQL Server.
Autore: Marco Caruso | Difficoltà:
Parallelismo tra SSIS e DTS, due prodotti a confronto
In questo articolo un'analisi sulle novità dei SQL Server 2005 Integration Services rispetto ai DTS di SQL Server 2000.
Autore: Alessandro Alpi | Difficoltà: | Commenti: 2
Overview dei SQL Server Integration Services (SSIS)
Scopriamo i nuovi Sql Server Integration Services presenti in SQL Server 2005 che sostituisco i DTS aggiungendo delle nuove funzionalità davvero interessanti
Autore: Alessandro Alpi | Difficoltà: | Commenti: 6 | Voto:
Leggere un file XML con SQL Server 2005
Scopriamo in questo articolo alcune potenzialità offerte dal nuovo database SQL 2005, tra cui il nuovo data type XML, e le Stored Procedures per importare e gestire all'interno del database file testuali in formato XML.
Autore: Lorenzo Benaglia | Difficoltà: | Commenti: 5
ExcelDataSetLib, una libreria .NET per esportare dati in formato Excel
In questo articolo verrà dimostrato come derivare la classe DataSet e integrare funzionalità per esportare in formato Excel XLS, XML o CSV i dati provenienti da un base dati qualsiasi.
Autore: David De Giacomi | Difficoltà: | Commenti: 3 | Voto:
Microsoft Application Blocks Data Access
Quante volte vi è capitato di riscrivere decine di volte lo stesso pezzo di codice all'interno di un progetto ? Scopriamo in questo articolo l'utilità dei Microsoft Application Blocks che vi permettono di ottimizzare il vostro codice evitando ripetizioni e vi facilitano la lettura.
Autore: Marco Caruso | Difficoltà:
Rivoluzione nel campo dei Reports con i SQL Reporting Services
Finalmente Microsoft ci mette a disposizione uno straordinario tool per la produzione di Report perfettamente integrato con l'architettura .NET. Fino ad ora siamo sempre stati abituati ad utilizzare il buono seppur limitato Crystal Report. Vediamo cosa cambia da ora in poi.
Autore: David De Giacomi | Difficoltà: | Commenti: 6 | Voto:
Scopriamo cosa sono gli Office XP PIA
Vediamo in quest'articolo una dettagliata introduzione dei PIA gli assemblies che permettono ad un'applicazione .NET di interagire e di dialogare con i prodotti della suite Microsoft Office XP.
Autore: David De Giacomi | Difficoltà: | Commenti: 6
Migliorare la qualità dei grafici nei Crystal Reports
In questo breve articolo vedremo come aumentare la qualità dei grafici prodotti da Crystal Reports durante il rendering tramite Web con ASP.NET e all'interno di applicazioni WinForms.
Autore: David De Giacomi | Difficoltà:
Costruire Report con ASP.NET e Crystal Reports
Vedremo in questo semplice Tutorial le istruzioni base che ci permetteranno di costruire un report avanzato usando ASP.NET e l'oggetto CrystalReportViewer integrato in questa versione di Visual Studio .NET.
Autore: David De Giacomi | Difficoltà: | Commenti: 14
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5