Skończyłem tutaj, próbując wdrożyć SharpZipLib.Portable. Zaczynam go używać bez IVirtualFileSystem
, ponieważ miałem już bibliotekę o nazwie (PCLStorage), która wie, jak czytać i pisać w systemie plików (przetestowane na iOS
i Android
).
UWAGA: Ten implementacje są wewnątrz PCL kierowania iOS
, Android
. Nie jest wymagany żaden specjalny kod dla systemu Android lub iOS.
Oto prosty przykład jak wyodrębnić plik zip za pomocą PCLStorage
i 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);
}
}
}
}
}
Jeśli chcesz uzyskać kilka przykładów, w jaki sposób korzystać z SharpZipLib.Portable
można przeczytać tutaj (oryginalna SharpZipLib): Code reference i Zip samples.
ALTERNATYWA:
Po robi to, co wyjaśniono powyżej skończyło się znacznie prostsze rozwiązanie, bo tylko potrzebne do obsługi plików ZIP. Użyłem ZipArchive Class
obecnych w System.IO.Compression
i PCLStorage
, więc z tym rozwiązaniem nie używam SharpZipLib.Portable
.
Oto wersja:
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);
}
}
}
}
}