Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

I problemi dell'oggetto GZipStream

Il .NET Framework, a partire dalla versione 2.0, fornisce il namespace System.IO.Compression, al cui interno troviamo, tra le altre, la classe GZipStream, con cui è possibile comprimere e decomprimere file in formato ZIP. Facendo qualche prova, tuttavia, ho notato che essa non garantisce un elevato livello di compressione, per usare un eufemismo... Il dubbio mi è venuto quando ho compresso un file PDF di 4,48 MB, ottenendo uno ZIP di 4,44 MB; mi sembrava un po' strano, quindi ho provato ad utilizzare WinRAR, che ha prodotto un archivio di appena 1,46 MB. Allora ho scaricato SharpZipLib: comprimendo lo stesso file con questa libreria, ho in effetti ottenuto un file di 1,46 MB. Per avere un riferimento, queste sono le due routine che ho utilizzato:

private static void CompressWithNET(string sourceFileName, string destinationFileName) { using (FileStream fs = new FileStream(destinationFileName, FileMode.Create)) { FileStream source = File.OpenRead(sourceFileName); byte[] buffer = new byte[source.Length]; source.Read(buffer, 0, buffer.Length); source.Close(); //Crea lo stream compresso. GZipStream zip = new GZipStream(fs, CompressionMode.Compress, false); //Comprime i dati. zip.Write(buffer, 0, buffer.Length); //Chiude lo stream. zip.Close(); } } public static void CompressWithSharpZipLib(string sourceFileName, string compressedFileName) { //Comprime il file specificato. using (ZipOutputStream zipStream = new ZipOutputStream( File.Create(compressedFileName))) { FileStream fs = File.OpenRead(sourceFileName); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); //Crea una nuova entry nel file ZIP. ZipEntry entry = new ZipEntry(Path.GetFileName(sourceFileName)); entry.DateTime = File.GetLastWriteTime(sourceFileName); entry.Size = fs.Length; fs.Close(); Crc32 Crc = new Crc32(); Crc.Update(buffer); entry.Crc = Crc.Value; zipStream.PutNextEntry(entry); zipStream.Write(buffer, 0, buffer.Length); //La compressione è terminata. zipStream.Finish(); } }

Da una rapida ricerca su Internet, sembra che il problema dello GZipStream abbia a che fare con la gestione interna del buffer utilizzato per mantenere i dati della compressione. Indagherò, ma nel frattempo continuerò ad utilizzare SharpZipLib.

Technorati Tags: , ,

Print | posted on Sunday, November 23, 2008 9:55 PM | Filed Under [ C# ]

Feedback

Gravatar

# re: I problemi dell'oggetto GZipStream

se puoi usa la libreria DotNetZip
11/24/2008 10:11 AM | Matteo Baglini
Gravatar

# SharpZipLib 1, DotNetZip 0

Dopo aver letto il mio post sui problemi con l'oggetto GZipStream , l'amico Matteo Baglini mi
11/26/2008 12:37 AM | Around and About .NET World
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET