0

我有一个 zip 密码文件并且知道这个密码。

我需要在 Windows 8 Metro 应用程序代码中打开这个 zip 文件。

但在 Windows 8 Metro 应用程序代码中不支持使用密码解压缩 zip 的“System.IO.Compression.ZipArchive”。

我正在尝试 SharpZipLib 和 DotNetZip。但它们不支持 net 4.5。所以我不在我的地铁程序代码中使用它们。

我正在尝试 Ionic.Zip。在程序代码中没问题。我想构建包以上传到 Windows 商店。但不能通过微软代码审查。

还有其他方法吗?多谢

4

2 回答 2

0

System.IO.Compression.FileSystem程序集不适用于 Windows 应用商店应用程序,因此您不能使用ZipFileExtensions 类ExtractToDirectory的扩展方法。

使用 StorageFile 代替 DirectoryInfo、FileInfo 等。有关如何在 Metro 风格应用程序中读取和写入文件的更多信息,请参阅访问数据和文件文件访问示例。然后,您需要将文件中的数据读取到流中,然后将其传递给以下类之一的方法(您的选择):

  • DeflateStream(从 .NET 4.5 开始在内部使用 zlib)

  • ZipArchiveGZipStream类。这些适用于 Metro 风格的应用程序,即使文件特定的扩展方法不可用。

  • Windows 运行时类型的解压器来解压文件。

于 2012-11-27T05:28:13.350 回答
0

您可以使用https://sharpcompress.codeplex.com/。它支持打开文件 zip 有密码

代码如下

//如果文件zip有一个文件pdf,一个文件xml

异步无效读取(存储文件文件){

        MemoryStream memoryFilePDf = new MemoryStream();

        MemoryStream memoryFileXml = new MemoryStream();

        FilePdf = null;

        FileXml = null;


        using (var zipStream = await file.OpenStreamForReadAsync())
        {
            using (MemoryStream zipMemoryStream = new MemoryStream((int)zipStream.Length))
            {
                await zipStream.CopyToAsync(zipMemoryStream);
                try
                {
                    using (var archive = ZipArchive.Open(zipMemoryStream, PassWord))
                    {
                        bool isFilePdf = false;
                        foreach (var entry in archive.Entries)
                        {
                            if (!entry.Key.ToLower().EndsWith(".pdf") && !entry.Key.ToLower().EndsWith(".xml"))
                            {
                                continue;
                            }

                            if (entry.Key.ToLower().EndsWith(".pdf"))
                            {
                                isFilePdf = true;
                                entry.WriteTo(memoryFilePDf);
                            }
                            else
                            {
                                isFilePdf = false;
                                entry.WriteTo(memoryFileXml);
                            }

                            var fileName = entry.Key.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault();
                            var createFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(fileName, Windows.Storage.CreationCollisionOption.GenerateUniqueName);

                            using (IRandomAccessStream stream = await createFile.OpenAsync(FileAccessMode.ReadWrite))
                            {
                                // Write compressed data from memory to file
                                using (Stream outstream = stream.AsStreamForWrite())
                                {
                                    byte[] buffer = isFilePdf ? memoryFilePDf.ToArray() : memoryFileXml.ToArray();
                                    outstream.Write(buffer, 0, buffer.Length);
                                    outstream.Flush();
                                }
                            }

                            if (isFilePdf)
                            {
                                FilePdf = createFile;
                            }
                            else
                            {
                                FileXml = createFile;
                            }

                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }
    }
于 2015-11-02T08:25:33.607 回答