Sono finito qui quando ho provato a implementare lo SharpZipLib.Portable. Inizio a usarlo senza lo IVirtualFileSystem
perché avevo già una libreria chiamata (PCLStorage) che sa leggere e scrivere nel filesystem (testata su iOS
e Android
).
NOTA: Questo implementazioni sono tutti all'interno di un PCL mira iOS
, Android
. Non sono necessari codici specifici per Android o iOS.
Ecco un semplice esempio come estrarre un file zip utilizzando PCLStorage
e SharpZipLib.Portable
:
public async void DonwLoadAndStoreZipFile()
{
var bytes = await DownloadImageAsync("https://github.com/fluidicon.png");
// IFolder interface comes from PCLStorage
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder folder = await rootFolder.CreateFolderAsync("zipFolder", CreationCollisionOption.OpenIfExists);
IFile file = await folder.CreateFileAsync("test.zip" , CreationCollisionOption.OpenIfExists);
using (Stream stream = await file.OpenAsync(FileAccess.ReadAndWrite))
{
await stream.WriteAsync(bytes, 0, bytes.Length);
using (var zf = new ZipFile(stream))
{
foreach (ZipEntry zipEntry in zf)
{
// Gete Entry Stream.
Stream zipEntryStream = zf.GetInputStream(zipEntry);
// Create the file in filesystem and copy entry stream to it.
IFile zipEntryFile = await rootFolder.CreateFileAsync(zipEntry.Name , CreationCollisionOption.FailIfExists);
using(Stream outPutFileStream = await zipEntryFile.OpenAsync(FileAccess.ReadAndWrite))
{
await zipEntryStream.CopyToAsync(outPutFileStream);
}
}
}
}
}
Se si desidera ottenere alcuni esempi su come utilizzare il SharpZipLib.Portable
potete leggere qui (original SharpZipLib): Code reference e Zip samples.
ALTERNATIVA:
Dopo aver fatto ciò che ho spiegato sopra ho finito con una soluzione molto più semplice, perché solo avevo bisogno di supportare i file ZIP. Ho usato ZipArchive Class
presente in System.IO.Compression
e PCLStorage
, quindi con questa soluzione non utilizzo SharpZipLib.Portable
.
Ecco la versione:
public async void DonwLoadAndStoreZipFile()
{
var bytes = await DownloadImageAsync(https://github.com/fluidicon.png);
// IFolder interface comes from PCLStorage
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder folder = await rootFolder.CreateFolderAsync("zipFolder", CreationCollisionOption.OpenIfExists);
IFile file = await folder.CreateFileAsync("test.zip" , CreationCollisionOption.OpenIfExists);
using (Stream stream = await file.OpenAsync(FileAccess.ReadAndWrite))
{
await stream.WriteAsync(bytes, 0, bytes.Length);
using(ZipArchive archive = new ZipArchive(stream))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
IFile zipEntryFile = await rootFolder.CreateFileAsync(entry.Name, CreationCollisionOption.FailIfExists);
using (Stream outPutStream = await zipEntryFile.OpenAsync(FileAccess.ReadAndWrite))
{
await entry.Open().CopyToAsync(outPutStream);
}
}
}
}
}