我想将SharpZipLib.Portable库添加到我的Xamarin.Forms PCL项目中。我的目标是Android和iOS。文档中提到您必须实现VirtualFileSystem才能使用该库,但是我不知道该怎么做,而且我无法找到有关此主题的很多信息。

有没有人使用过这个可以指导我使用该库的步骤的库?

最佳答案

当尝试实现SharpZipLib.Portable时,我到这里结束了。
我开始不使用IVirtualFileSystem来使用它,因为我已经有了一个名为(PCLStorage)的库,该库知道如何在文件系统中进行读写(在iOSAndroid上进行了测试)。

注意:此实现全部在PCL内以iOSAndroid为目标。不需要用于Android或iOS的特定代码。

这是一个简单的示例,说明如何使用PCLStorageSharpZipLib.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 ClassSystem.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/

10-11 20:15