我想将SharpZipLib.Portable库添加到我的Xamarin.Forms
PCL项目中。我的目标是Android和iOS。文档中提到您必须实现VirtualFileSystem
才能使用该库,但是我不知道该怎么做,而且我无法找到有关此主题的很多信息。
有没有人使用过这个可以指导我使用该库的步骤的库?
最佳答案
当尝试实现SharpZipLib.Portable时,我到这里结束了。
我开始不使用IVirtualFileSystem
来使用它,因为我已经有了一个名为(PCLStorage)的库,该库知道如何在文件系统中进行读写(在iOS
和Android
上进行了测试)。
注意:此实现全部在PCL内以iOS
和Android
为目标。不需要用于Android或iOS的特定代码。
这是一个简单的示例,说明如何使用PCLStorage
和SharpZipLib.Portable
提取Zip文件:
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);
}
}
}
}
}
关于c# - 如何实现SharpZipLib.Portable所需的VirtualFileSystem?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31248492/