Я оказался здесь, пытаясь реализовать SharpZipLib.Portable. Я начал использовать его без IVirtualFileSystem
, потому что у меня уже была библиотека (PCLStorage), которая знает, как читать и писать в файловой системе (протестировала ее на iOS
и Android
).
ПРИМЕЧАНИЕ: Эта реализация все внутри PCL таргетирования iOS
, Android
. Не требуется никакого специального кода для Android или iOS.
Вот простой пример того, как извлечь Zip файл с помощью PCLStorage
и 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);
}
}
}
}
}
Если вы хотите получить некоторые примеры того, как использовать SharpZipLib.Portable
вы можете прочитать здесь (оригинал SharpZipLib): Code reference и Zip samples.
АЛЬТЕРНАТИВА:
После делать то, что я объяснил выше, я в конечном итоге с гораздо более простым решением, потому что я нужен только для поддержки ZIP файлов. Я использовал ZipArchive Class
в System.IO.Compression
и PCLStorage
, поэтому с этим решением я не использовал 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(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);
}
}
}
}
}