如何在Xamarin表单中解压缩下载的Zip文件

时间:2017-02-08 16:21:54

标签: xamarin xamarin.forms dotnetzip sharpziplib

在我的应用程序中,我在My API调用期间收到包含4个pdf文档的ZIP文件。我正在使用以下代码保存ZIP文件。

var rootFolder = FileSystem.Current.LocalStorage;
var file = await rootFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

using (var fileHandler = await file.OpenAsync(FileAccess.ReadAndWrite))
{
    await fileHandler.WriteAsync(document, 0, document.Length);
}

保存文档后

如何解压缩并将pdf文档单独保存到手机内存中。任何人都可以指示我解决这个问题。我找到了SharpZipLib&用于解压缩代码的标志性zip库;但是如果在文档中找到了dot net实现,则不知道如何在Xamarin Forms中集成它。

请帮忙。

2 个答案:

答案 0 :(得分:1)

.NET System.IO.Compression 中有一个内置的压缩​​系统。

使用起来真的很简单:

using System.IO.Compression;
ZipFile.ExtractToDirectory(zipPath, extractPath);

我已经在 Xamarin.Forms 4.7 中对其进行了测试,并且可以正常工作。

ZipFile.ExtractToDirectory(
    Path.Combine(Xamarin.Essentials.FileSystem.CacheDirectory,"archive.zip"),//zipPath 
    Xamarin.Essentials.FileSystem.AppDataDirectory//extractPath
);

在此示例中,我使用 Xamarin.Essentials 来获取常用目录,但这不是强制性的。

答案 1 :(得分:0)

您可以使用SharpZipLib解压缩下载的文件。我添加了一个将文件解压缩到下面用户定义位置的功能。

    private async Task<bool> UnzipFileAsync(string zipFilePath, string unzipFolderPath)
    {
        try
        {
            var entry = new ZipEntry(Path.GetFileNameWithoutExtension(zipFilePath));
            var fileStreamIn = new FileStream(zipFilePath, FileMode.Open, FileAccess.Read);
            var zipInStream = new ZipInputStream(fileStreamIn);
            entry = zipInStream.GetNextEntry();
            while (entry != null && entry.CanDecompress)
            {
                var outputFile = unzipFolderPath + @"/" + entry.Name;
                var outputDirectory = Path.GetDirectoryName(outputFile);
                if (!Directory.Exists(outputDirectory))
                {
                    Directory.CreateDirectory(outputDirectory);
                }

                if (entry.IsFile)
                {
                    var fileStreamOut = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
                    int size;
                    byte[] buffer = new byte[4096];
                    do
                    {
                        size = await zipInStream.ReadAsync(buffer, 0, buffer.Length);
                        await fileStreamOut.WriteAsync(buffer, 0, size);
                    } while (size > 0);
                    fileStreamOut.Close();
                }

                entry = zipInStream.GetNextEntry();
            }
            zipInStream.Close();
            fileStreamIn.Close();
        }
        catch
        {
            return false;
        }
        return true;
    }