Ciao,
giusto in questi giorni durante la fase di realizzazione di un App per Windows 8, mi sono imbattuto nell’utilizzo di una delle novità del Framework 4.5, haimè poco pubblicizzate, ma che ritengo di notevole interesse, costituita dalla possibilità di manipolare archivi compressi con l’algoritmo Zip classico.
Stiamo parlando di un’aggiunta al già esistente namespace System.IO.Compression che ora viene incontro all’esigenza della gestione di archivi compressi.
Dopo questa prima sperimentazione posso assolutamente dire che questo nuovo namespace è un pò spartano, ma comunque un buon supporto se non abbiamo esigenze particolari, se invece abbiamo la necessità di usare funzionalità avanzate SharpZipLib e DotNetZip rimangono le library di riferimento. 🙂
Ad ampliare System.IO.Compression.dll ora abbiamo a disposizione il namespace System.IO.Compression.FileSystem.dll dove mettiamo in evidenza le classi:
System.IO.Compression.FileSystem.ZipFile
System.IO.Compression.FileSystem.ZipArchive
Partiamo con la classe ZipFile dove troviamo 2 metodi principali:
– CreateFromDirectory
– ExtractToDirectory
I due metodi ci permettono di zippare/upzippare un archivio in una determinata destinazione, vedi esempio qui sotto:
ZipFile.CreateFromDirectory("", "", CompressionLevel.Optimal, true)
ZipFile.ExtractToDirectory("", "")
Il nuovo namespace mette a disposizione due classi chiamate ZipArchive e ZipArchiveEntry, le quali rappresentano, rispettivamente, un archivio Zip e una entry, cioè un singolo elemento dello Zip/Archivio.
La classe ZipFile, vista in precedenza, espone un metodo Open che restituisce un’istanza di ZipArchive.
E’ quindi possibile leggere il contenuto dell’archivio eseguendo una semplice interazione della collezione Entries che risulta essere una ReadOnlyCollection vedi esempio:
using(ZipArchive zip = ZipFile.Open("", ZipArchiveMode.Read))
{
foreach(var item in zip.Entries)
{
Console.WriteLine("FileName: {0} ", item.FullName)
}
}
Ecco le proprietà della classe ZipArchiveEntry:
– FullName (che identifica il path completo del file)
– CompressedLength (dimensione in bytes da compresso)
– Length (la dimensione originaria del file)
– Name (nome senza il path)
– LastWriteTime (data/ora dell’ultima modifica)
Creazione di un Archivio compresso:
using(ZipArchive zip = ZipFile.Open("", ZipArchiveMode.Create))
{
zip.CreateEntry("", CompressionLevel.Optimal)
}
Modificare un archivio Zip esistente aggiungendo o rimuovendo file:
using(ZipArchive zip = ZipFile.Open("", ZipArchiveMode.Update))
{
zip.CreateEntry("", CompressionLevel.Fastest)
ZipArchiveEntry zipEntry = zip.GetEntry("")
zipEntry.Delete()
}
Vista la semplicità di utilizzo non mi soffermerei troppo sulle varie implementazioni mostrate, ma aggiugeree qualche considerazione:
– La classe ZipArchive implementa l’interfaccia IDisposable quindi è consigliato l’utilizzo nel blocco using.
– Durante la creazione di un archivio compresso i file elencati verranno aggiunti allo Zip solo quando il blocco using sarà finalizzato.
– Nella fase di Update di un archivio compresso, le modifiche saranno applicate solo quanto il blocco using sarà finalizzato.
Bene, credo di avervi raccontato tutta la mia esperienza sull’argomento, come accennato prima, il nuovo utilissimo namespace è ancora un pò spartano viste le poche funzionalità a disposizione, ma è comunque un inizio è un buon supporto nell’attesa di una sua estensione nelle prossime versioni del Framework.
Maurizio 🙂
