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;
}
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.
Nessun commento:
Posta un commento