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