如何在windows 8 metro程序中用密码解压缩zip?

时间:2012-10-29 02:27:56

标签: c# windows-8 .net-4.5

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

我需要在Windows 8 metro应用程序代码中打开此zip文件。

但在Windows 8 metro应用程序代码中,不支持使用密码解压缩'System.IO.Compression.ZipArchive'。

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

我试试Ionic.Zip。它在程序代码中没问题。我想构建要上传到Windows商店的包。但是没有通过微软代码审查。

还有其他方法吗? 非常感谢

2 个答案:

答案 0 :(得分:0)

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

而不是DirectoryInfo,FileInfo等使用StorageFile。有关如何在Metro风格应用中读取和写入文件的详细信息,请参阅Accessing data and filesFile access sample。然后,您需要将文件中的数据读入流中,然后将其传递给以下类之一的方法(您的选择):

答案 1 :(得分:0)

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

代码吼叫

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

async void Read(StorageFile文件)         {

        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);
                }
            }
        }
    }