【发布时间】:2013-04-05 22:29:15
【问题描述】:
我正在为 Windows 8 构建一个 Metro 风格的应用程序,我有一个从 Web 服务下载的 zip 文件,我想将其解压缩。
我已经看到了压缩和解压缩的示例,但这需要一个文件来压缩/解压缩它。我需要提取一个完整的目录结构。
这是我目前所拥有的:
var appData = ApplicationData.Current;
var file = await appData.LocalFolder.GetItemAsync("thezip.zip") as StorageFile;
var decompressedFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("tempFileName", CreationCollisionOption.GenerateUniqueName);
using (var decompressor = new Decompressor(await file.OpenSequentialReadAsync()))
using (var decompressedOutput = await decompressedFile.OpenAsync(FileAccessMode.ReadWrite))
{
var bytesDecompressed = await RandomAccessStream.CopyAsync(decompressor, decompressedOutput);
}
但这并不好,bytesDecompressed 变量的大小始终为零,但 zip 文件为 1.2MB
我们将不胜感激。
编辑:回答,感谢Mahantesh
下面是解压文件的代码:
private async void UnZipFile()
{
var folder = ApplicationData.Current.LocalFolder;
using (var zipStream = await folder.OpenStreamForReadAsync("thezip.zip"))
{
using (MemoryStream zipMemoryStream = new MemoryStream((int)zipStream.Length))
{
await zipStream.CopyToAsync(zipMemoryStream);
using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Read))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (entry.Name != "")
{
using (Stream fileData = entry.Open())
{
StorageFile outputFile = await folder.CreateFileAsync(entry.Name, CreationCollisionOption.ReplaceExisting);
using (Stream outputFileStream = await outputFile.OpenStreamForWriteAsync())
{
await fileData.CopyToAsync(outputFileStream);
await outputFileStream.FlushAsync();
}
}
}
}
}
}
}
}
【问题讨论】:
-
我已经实现了这个代码来解压我的 ApplicationData.Current.LocalFolder 文件夹中的一个 zip 文件。但 zip 包含文件夹和子文件夹。因此,代码在运行时会在这些子文件夹中执行 await outputFile.OpenStreamForWriteAsync() 操作时给出“访问被拒绝错误”。但是,当代码多次运行时,在任何随机子文件夹中都会出现错误。有什么想法吗??
-
好的..错误是我将 UnZipFile 方法作为我不应该做的静态方法...
标签: c# compression windows-8