我正在爲Windows 8構建一個metro風格的應用程序,並且我有一個zip文件,我從Web服務下載並且我想提取它。在Windows 8上解壓ZIP文件C#
我已經看到了壓縮和解壓縮的示例,但是需要一個文件來壓縮/解壓縮它。我有一個完整的目錄結構,我需要提取。
這是我到目前爲止有:
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
變量始終是零大小,但壓縮文件1.2MB
任何幫助這裏將不勝讚賞。
編輯:回答,感謝Mahantesh
這裏是解壓文件的代碼:通過使用ZipArchive,ZipArchiveEntry方法
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()操作時給出「訪問被拒絕錯誤」。但是,錯誤發生在代碼運行多次的任何隨機子文件夾中。對此有任何想法? – 2014-11-26 05:35:50
好吧..錯誤是我已經使UnZipFile方法作爲靜態方法,我不應該這樣做... – 2014-12-22 06:06:21