Decomprimere file tar e gz tramite libreria tar-cs

Come decomprimere in C# file di tipo tar e gz.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come utilizzare la libreria Tar-Cs per decomprimere file compressi tramite il linguaggio di programmazione C#.
Prima di creare il progetto, bisogna scaricare la libreria gratuita, qui https://code.google.com/p/tar-cs/ è possibile scaricare il sorgente ed il componente.

Stesura del codice

Utilizzeremo un progetto di tipo Windows Application, per scoprire come utilizzare questo componente.
Dopo aver creato un progetto di tipo Windows Application, inseriamo un pulsante nella Windows Form, in questo modo al click del pulsante verrà eseguita l’operazione di estrazione file.

Passiamo in visualizzazione codice ed in particolare nell’evento “Click” del pulsante, dobbiamo scrivere il codice che permette di decomprimere il file.

Nell'evento verrà richiamata una funzione, che gli viene passata la cartella nella quale si trovano i file compressi.

Qui di seguito si riporta il frammento di codice delle suddette operazioni.

private void BtnEstrai_Click(object sender, EventArgs e)
        {
            if (DecomprimiFileCompresso(@"C:\CartellaFile\") == true)
            {
                MessageBox.Show("File estratti con successo.");
            }
            else
            {
                MessageBox.Show("Impossibile estrare i file");
            }
        }



Il codice precedente è molto semplice, richiama una funzione (DecomprimiFileCompresso) in uno specifico percorso.
la funzione riportata qui di seguito, cerca tutti quei compressi di tipo .gz.

A sua volta verrà richiamata una funzione che permette di decomprimere tali file.

Qui di seguito si riporta il codice di tale operazioni.



private static bool DecomprimiFileCompresso(string PercorsoFile)
        {
            bool Esito = false;
            try
            {
                //eseguo la prima estrapolazione del file .gz nella stessa cartella dove si trovano i file .gz
                DirectoryInfo DiPercorsoFileGz = new DirectoryInfo(PercorsoFile);
                foreach (FileInfo fi in DiPercorsoFileGz.GetFiles("*.gz"))
                {
                    DecomprimiFileGz(fi);
                }
                //Decomprimo tutti i file *.tar
                Esito = DecomprimiFileTar(PercorsoFile);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return Esito;
        }


La funzione “DecomprimiFileCompresso” esegue una ricerca nella cartella che viene passata ed estrapola tutti i file .tar contenuti nel vari file di tipo “gz”.
A questo punto viene eseguita una funziona per estrapolare tutti i file di tipo gz e poi successivamente tutti i file di tipo “Tar”.

Qui di seguito sono riportati tali funzioni,
private static bool DecomprimiFileTar(string PercorsoFile)
        {
            bool Esisto = false;
            try
            {
                DirectoryInfo di = new DirectoryInfo(PercorsoFile);
                //Decomprimo tutti i file di tipo *.tar
                foreach (FileInfo fi in di.GetFiles("*.tar"))
                {
                    string PercorsoFileDecompresso = "";
                    string PathCartellaFile = "";
                    using (FileStream unarchFile = File.OpenRead(fi.FullName))
                    {
                        TarReader reader = new TarReader(unarchFile);
                        while (reader.MoveNext(true))
                        {
                            var path = reader.FileInfo.FileName;
                            if (reader.FileInfo.EntryType == EntryType.Directory)
                            {
                                //Essendo una cartella verifico se è quella che interessa (percorso superiore)
                                if (PercorsoFile.Contains(Path.GetDirectoryName(path)) == true)
                                {
                                    //creo la cartella ed estrapolo i dati
                                    PercorsoFileDecompresso = Path.Combine(PercorsoFile, Path.GetDirectoryName(path));
                                    Directory.CreateDirectory(PercorsoFileDecompresso);
                                    PathCartellaFile = Path.GetDirectoryName(path);
                                }
                            }
                            else
                            {
                                //Elaboro solo se nella variabile path (nome file) è presente la cartella da cui devo estrapolare i dati.
                                if (path.Contains("MioFile") & PathCartellaFile.Trim().Length > 1)
                                {
                                    //verifico che sia superiore a 3000 byte ossia 3 kb
                                    if (reader.FileInfo.SizeInBytes >= 3000)
                                    {
                                        path = Path.Combine(PercorsoFileDecompresso, Path.GetFileName(path));
                                        using (FileStream file = File.Create(path))
                                        {
                                            reader.Read(file);
                                            Esisto = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return Esisto;
        }
        public static void DecomprimiFileGz(FileInfo pFileInfo)
        {
            //Rilevo lo stream dei file e decomprimo tutti i file .
            using (FileStream StreamFile = pFileInfo.OpenRead())
            {
                //imposto il nome del file togliendo l'estenzione .gz
                string FileCorrente = pFileInfo.FullName;
                string FileOrigine = FileCorrente.Remove(FileCorrente.Length - pFileInfo.Extension.Length);
                using (FileStream outFile = File.Create(FileOrigine))
                {
                    using (GZipStream Decompress = new GZipStream(StreamFile,    CompressionMode.Decompress))
                    {
                        byte[] buffer = new byte[4096];
                        int numRead;
                        while ((numRead = Decompress.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            outFile.Write(buffer, 0, numRead);
                        }
                    }
                }
            }
        }


La funzione “DecomprimiFileTar”, estrae solo quei file che contengono il nome  di tipo “MioFile” e che hanno una dimensione superiore ai 3 kb. Questa gestione dei file avviene tramite la classe "TarReader" che permette la gestione dei file compressi.

Conclusioni

L’articolo ha voluto illustrare le potenzialità di questo componente, che può tornare utile anche in quei contesti con sistemi diversi.
Tramite la parola “Download” potete scaricare il progetto di esempio di questo articolo.