venerdì 1 settembre 2017

.Net comprimere i file con le classi .Net 4.5 tramite VB.Net e C#

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_creazione-di-file-compressi-zip-tramite-_1518.aspx

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.

Nessun commento: