Dall'archivio articoli > Windows Phone
Gestione di file compressi in Windows Phone con la libreria SharpZipLib
- 0
- 0
- 0
- 1,00 MB
Per poter utilizzare questa funzionalità, devi fare il login o iscriverti.
Recentemente, nello sviluppo di una mia applicazione per Windows Phone, mi sono trovato nella necessità di implementare il supporto al backup dei dati della stessa su Skydrive, così da dare all'utente la possibilità di non perdere nulla anche in caso di ripristino o acquisto di un nuovo device Windows Phone. Si tratta di una procedura piuttosto semplice, grazie al rilascio da parte di Microsoft della Live SDK, una libreria che consente di interagire con tutti i principali servizi Microsoft, tra cui Skydrive (potete approfondire l'argomento in questo articolo).
Dato che, però, ci troviamo su un dispositivo mobile, ho pensato di ottimizzare al massimo l'esperienza utente, cercando di ridurre il più possibile il tempo e la banda necessari per effettuare le operazioni di backup e ripristino: per raggiungere questo obiettivo la soluzione più semplice ed efficace è stata quella di comprimere il file da salvare (nel mio caso, un file XML nel quale vengono serializzati i dati della mia applicazione).
Vediamo come gestire questo scenario, grazie all'aiuto di una libreria open source chiamata SharpZipLib.
Esiste un porting specifico di SharpZipLib per Windows Phone che potete installare tramite NuGet: semplicemente fate click con il tasto destro sul vostro progetto in Visual Studio, scegliete la voce Manage NuGet packages e cercate e installate il pacchetto di nome SharpZipLib-WP7.
A questo punto siete pronti per iniziare a sfruttare le funzionalità di compressione offerte dalla libreria.
Partiamo dal presupposto che, all'interno dell'isolated storage della vostra applicazione, abbiate un file che volete comprimere e che si chiami data.txt (nel progetto di esempio che accompagna questo articolo è presente una funzione per copiare un file di esempio dal progetto allo storage). Il primo passo è quello di aggiungere, nel codice della nostra classe, i namespace che contengono classi e metodi della libreria, ovvero
using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; A questo punto siano in grado di comprimere il nostro file:<pre class="brush: csharp;">private void OnCompressFileClicked(object sender, RoutedEventArgs e) { using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { using (IsolatedStorageFileStream fileToCompress = storage.OpenFile("data.txt", FileMode.Open, FileAccess.Read)) { using (IsolatedStorageFileStream zipFile = storage.OpenFile("CompressedFile.zip", FileMode.Create, FileAccess.ReadWrite)) { ZipOutputStream file = new ZipOutputStream(zipFile); ZipEntry entry = new ZipEntry("data.txt"); file.PutNextEntry(entry); StreamUtils.Copy(fileToCompress, file, new byte[4096]); file.CloseEntry(); file.IsStreamOwner = true; file.Close(); } } } }
In questo caso utilizziamo le API di Windows Phone 7 per la gestione dello storage, così da poter riutilizzare questo codice sia all?interno di un?applicazione Windows Phone 7 che Windows Phone 8 (grazie alla retro compatibilità della piattaforma).
Sono tre i passaggi che facciamo sfruttando le API dello storage:
Tutte queste operazioni vengono inserite all'interno di un blocco using: in questo modo, una volta terminate, l'accesso ai vari stream sarà automaticamente chiuso, evitando all'applicazione di bloccare e consumare risorse non necessarie. Quello che abbiamo a disposizione, quindi, sono due stream: uno già pieno, con il contenuto del file da comprimere, e uno vuoto, che invece andremo a "riempire" con i dati compressi. A questo punto entrano in gioco le API offerte dalla libreria SharpZipLib: creiamo un nuovo oggetto di tipo ZipOutputStream, che rappresenta il nostro file compresso. Nel costruttore, infatti, dobbiamo passare come parametro lo stream di scrittura (il secondo che abbiamo creato, di nome zipFile). Un file compresso può contenere, al suo interno, più file: ognuno di essi è rappresentato da un oggetto di tipo ZipEntry. La procedura da seguire (e da ripetere per ogni file) è la seguente:
Se si volesse aggiungere un altro file, è sufficiente ripetere questa procedura passando, come primo parametro del metodo StreamUtils.Copy() lo stream del nuovo file da includere all'interno del file compresso.
Una volta terminata la procedura, possiamo liberare le risorse e chiudere lo stream del file compresso invocando il metodo Close().
A questo punto, sfruttando un tool come Windows Phone Power Tools (che consente di esplorare l'isolated storage di un'applicazione installata sull'emulatore o sul telefono), possiamo verificare che sia andato tutto a buon fine: se abbiamo eseguito l'operazione correttamente, troveremo nella root dello storage un file compresso che, al suo interno, conterrà il file (o i file) della nostra applicazione. E' possibile, tramite le proprietà offerte dalle classi ZipOutputStream personalizzare il processo di compressione: ad esempio, tramite il metodo SetLevel() è possibile specificare il livello di compressione, da 0 (minimo) a 9 (massimo), oppure creare un archivio protetto da password assegnando un valore alla proprietà Password.
Attenzione: Questo articolo contiene un allegato.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.