Creazione di file Compressi (zip) tramite le classi di .Net

Una breve introduzione all'utilizzo delle nuove classi per comprimere e decomprimere i file con il framework .Net che offre semplicità nel creare applicazioni e funzionalità per la compressione dei file.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come utilizzare le nuove classi messe a disposizione a partire dal framework 4.5 per comprimere e decomprimere i file, tramite il linguaggio VB.Net e C#.

Queste nuove classi permettono di gestire in maniera semplice e con poche righe di codice i file compressi.
Si crea un nuovo progetto web, in Asp.Net, secondo il proprio linguaggio di interesse.
Il codice può essere utilizzato anche in ambiente Windows Application, ma in questo articolo, vedremo anche come effettuare il download del file compresso creato ed eliminarlo, classico scenario in cui si selezionano dei file e si decide di effettuare il download dei file in formato zip.
Dopo aver creato il progetto di tipo web application, aggiungere due pulsanti, uno avrà il compito di effettuare il download, l’altro di decomprimere.
Aggiungiamo al progetto i riferimenti alla dll “System.IO.Compression” e “System.IO.Compression.FileSystem”.
Passiamo in visualizzazione codice, ed in alto sopra tutto al codice, dobbiamo aggiungere lo spazio dei nomi per la gestione dei file compressi.
Qui di seguito un esempio di codice in VB.Net e C#

VB.Net
Imports System.IO
Imports System.IO.Compression
C#
using System.IO.Compression;
using System.IO;

Nell’evento click, dobbiamo inserire il codice per la gestione dei file “zip”, in particolare faremo riferimento alla classe “ZipArchive” con la quale si andrà a creare il file “.zip” nel nostro pc, passando come parametri, lo stream del percorso e nome del file .zip, che andremo a creare e la modalità in cui andremo ad inserire i file.
Tramite il metodo “CreateEntryFromFile” inseriamo i file compressi, indicando il file, ed il nome che dovrà avere nel file compresso.
Il metodo restituire un oggetto di tipo “ZipArchiveEntry”.
Qui di seguito le suddette operazioni nell’evento click del primo pulsante

VB.Net
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Using FileStreamCompresso As FileStream = File.Create("E:\MioZip.zip")
Dim filesDaComprimere As New List(Of String)()
filesDaComprimere.Add("E:\File1.txt")
filesDaComprimere.Add("E:\File2.txt")
'Creo il file zip nello stream dati di un percorso e nome del file
Using zipArchiveFileZip As New ZipArchive(FileStreamCompresso, ZipArchiveMode.Update)
For Each fileDaComprimere As String In filesDaComprimere
Dim fileInfoInZip As New FileInfo(fileDaComprimere)
'lo aggiungo al file zip e comprimo
Dim zipArchiveEntryFilezip As ZipArchiveEntry = zipArchiveFileZip.CreateEntryFromFile(fileDaComprimere, fileInfoInZip.Name)
Next
End Using
End Using
Dim FileInfoZip As New FileInfo("E:\MioZip.zip")
HttpContext.Current.Response.ContentType = "application/zip"
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileInfoZip.Name)
HttpContext.Current.Response.AddHeader("FileTemporaneoZip", "E:\MioZip.zip")
HttpContext.Current.Response.WriteFile("E:\MioZip.zip")
HttpContext.Current.ApplicationInstance.CompleteRequest()
End Sub
C#
protected void Button1_Click(object sender, EventArgs e)
{
using (FileStream FileStreamCompresso = File.Create("E:\\MioZip.zip"))
{
List<string> filesDaComprimere = new List<string>();
filesDaComprimere.Add(@"E:\File1.txt");
filesDaComprimere.Add(@"E:\File2.txt");
//Creo il file zip nello stream dati di un percorso e nome del file
using (ZipArchive zipArchiveFileZip = new ZipArchive(FileStreamCompresso, ZipArchiveMode.Update))
{
foreach (string fileDaComprimere in filesDaComprimere)
{
FileInfo fileInfoInZip = new FileInfo(fileDaComprimere);
//lo aggiungo al file zip e comprimo
ZipArchiveEntry zipArchiveEntryFilezip = zipArchiveFileZip.CreateEntryFromFile(fileDaComprimere, fileInfoInZip.Name);
}
}
}
FileInfo FileInfoZip = new FileInfo("E:\\MioZip.zip");
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileInfoZip.Name);
HttpContext.Current.Response.AddHeader("FileTemporaneoZip", "E:\\MioZip.zip");
HttpContext.Current.Response.WriteFile("E:\\MioZip.zip");
HttpContext.Current.ApplicationInstance.CompleteRequest();
}

Come si vede, al termine della creazione del file zip, verrà effettuato il download del file, da notare che nella response, verrà impostata una variabile “FileTemporaneoZip” nella quale conterrà il percorso e nome del file compresso, che andremo a cancellare al termine del response, tramite il codice situato nella globxasax.
A questo punto, dobbiamo scrivere il codice nell’evento “Application_EndRequest” il quale cancellerà il file “Zip” in modo da avere nel server, le cartelle sempre pulite, questo avviene perché nella response, abbiamo impostato nella variabile “FileTemporaneoZip” il percorso e nome del file “zip”.
Qui di seguito si riporta l’esempio di codice per entrambi i linguaggi.

VB.Net
Protected Sub Application_EndRequest(sender As Object, e As EventArgs)
Try
'Verifico che è presente il percorso
If HttpContext.Current.Response.Headers("FileTemporaneoZip") IsNot Nothing Then
'Cancello il file rilevando il percorso del file
Dim tempZipFilePath As String = HttpContext.Current.Response.Headers("FileTemporaneoZip")
File.Delete(tempZipFilePath)
End If
Catch
Finally
'Svuoto la variabile relativo al percorso del file zip
If HttpContext.Current.Response.Headers("FileTemporaneoZip") IsNot Nothing Then
HttpContext.Current.Response.Headers.Remove("FileTemporaneoZip")
End If
End Try
End Sub
C#
protected void Application_EndRequest(object sender, EventArgs e)
{
try
{
//Verifico che è presente il percorso
if (HttpContext.Current.Response.Headers["FileTemporaneoZip"] != null)
{
//Cancello il file rilevando il percorso del file
string tempZipFilePath = HttpContext.Current.Response.Headers["FileTemporaneoZip"];
File.Delete(tempZipFilePath);
}
}
catch
{
}
finally
{
//Svuoto la variabile relativo al percorso del file zip
if (HttpContext.Current.Response.Headers["FileTemporaneoZip"] != null)
HttpContext.Current.Response.Headers.Remove("FileTemporaneoZip");
}
}

Nell’esempio qui di seguito, vediamo come decomprimere da un file compresso “zip” estraendo i file presenti al suo interno.
Tramite il metodo “ExtractToDirectory” della classe “ZipArchive” passando come parametro il percorso e nome della cartella in cui vogliamo estrae i file compressi. Possiamo impostare anche una cartelle che non esiste.
Qui di seguito un esempio di codice per i linguaggi di programmazione VB.Net e C#

VB.Net
Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Using estraiZipArchive As New ZipArchive(New FileStream("E:\Miozip.zip", FileMode.Open))
'indico una cartella dove estrae i file, può anche non esistere
estraiZipArchive.ExtractToDirectory("E:\CartellaEstratta")
End Using
End Sub
C#
protected void Button2_Click(object sender, EventArgs e)
{
using (ZipArchive estraiZipArchive = new ZipArchive(new FileStream("E:\\Miozip.zip", FileMode.Open)))
{
//indico una cartella dove estrae i file, può anche non esistere
estraiZipArchive.ExtractToDirectory("E:\\CartellaEstratta");
}
}

Conclusioni


L’articolo ha voluto introdurre il lettore alla conoscenza delle nuove classi per la compressione dei file, tramite il framework 4.5 il quale fornisce un ulteriore passo in avanti per la compressione dei file dalle versioni precedenti. Con queste nuove classi l’utilizzo dei metodi semplifica di molto la gestione dei file compressi.