我有一个zip密码文件并知道这个密码。
我需要在Windows 8 metro应用程序代码中打开此zip文件。
但在Windows 8 metro应用程序代码中,不支持使用密码解压缩'System.IO.Compression.ZipArchive'。
我正在试用SharpZipLib和DotNetZip。但他们不支持4.5。所以我不会在我的地铁程序代码中使用它们。
我试试Ionic.Zip。它在程序代码中没问题。我想构建要上传到Windows商店的包。但是没有通过微软代码审查。
还有其他方法吗? 非常感谢
答案 0 :(得分:0)
System.IO.Compression.FileSystem
程序集不适用于Windows应用商店应用,因此您无法使用ZipFileExtensions class的ExtractToDirectory
扩展方法。
而不是DirectoryInfo,FileInfo等使用StorageFile。有关如何在Metro风格应用中读取和写入文件的详细信息,请参阅Accessing data and files和File access sample。然后,您需要将文件中的数据读入流中,然后将其传递给以下类之一的方法(您的选择):
DeflateStream(从.NET 4.5开始在内部使用zlib)
ZipArchive或GZipStream个类。对于Metro风格的应用程序,这些是available,即使文件特定的扩展方法不是。
Windows运行时类型Decompressor解压缩文件。
答案 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);
}
}
}
}