c# xamarin.forms portable-class-library sharpziplib

c# - ¿Cómo implemento VirtualFileSystem requerido por SharpZipLib.Portable?



xamarin.forms portable-class-library (1)

Me gustaría agregar la biblioteca SharpZipLib.Portable a mi proyecto PCL Xamarin.Forms . Me estoy orientando a Android y iOS. La documentación menciona que debe implementar un VirtualFileSystem para usar la biblioteca, pero no sé cómo hacerlo y no he podido encontrar mucha información sobre este tema.

¿Alguien ha usado esta biblioteca que pueda guiarme en los pasos necesarios para usarla?


Terminé aquí cuando intento implementar SharpZipLib.Portable . IVirtualFileSystem usarlo sin el IVirtualFileSystem porque ya tenía una biblioteca llamada ( PCLStorage ) que sabe leer y escribir en el sistema de archivos (lo probé en iOS y Android ).

NOTA : Todas estas implementaciones están dentro de una PCL dirigida a iOS , Android . No se necesita ningún código específico para Android o iOS.

Aquí hay un ejemplo simple de cómo extraer un archivo Zip usando PCLStorage y 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); } } } } }

Si desea obtener algunos ejemplos sobre cómo usar SharpZipLib.Portable , puede leer aquí ( SharpZipLib original): Referencia de código y muestras Zip .

ALTERNATIVA:

Después de hacer lo que expliqué anteriormente, terminé con una solución mucho más simple porque solo necesitaba soportar archivos ZIP. Utilicé ZipArchive Class presente en System.IO.Compression y PCLStorage , por lo que con esta solución no utilicé SharpZipLib.Portable .

Aquí está la versión:

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); } } } } }