压缩文件夹中的所有文件

时间:2012-11-27 20:26:54

标签: vb.net microsoft-metro zip windows-runtime access-denied

我对WinRT开发平台有点新意,它已经让我发疯了(我是一个长期的.Net开发人员,所有那些删除的API都很烦人) 压缩Windows.Storage.ApplicationData.Current.TemporaryFolder中存在的所有文件时遇到问题 这是我目前的代码(VB.Net,基于MSDN代码,“文件”是我将所有文件放入的zip文件):

Using zipMemoryStream As New MemoryStream()
Using zipArchive As New Compression.ZipArchive(zipMemoryStream, Compression.ZipArchiveMode.Create)
    For Each fileToCompress As Windows.Storage.StorageFile In (Await Windows.Storage.ApplicationData.Current.TemporaryFolder.GetFilesAsync())
        Dim buffer As Byte() = WindowsRuntimeBufferExtensions.ToArray(Await Windows.Storage.FileIO.ReadBufferAsync(fileToCompress))
        Dim entry As ZipArchiveEntry = zipArchive.CreateEntry(fileToCompress.Name)
        Using entryStream As Stream = entry.Open()
            Await entryStream.WriteAsync(buffer, 0, buffer.Length)
        End Using
    Next
End Using
Using zipStream As Windows.Storage.Streams.IRandomAccessStream = Await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)
    Using outstream As Stream = zipStream.AsStreamForWrite()
        Dim buffer As Byte() = zipMemoryStream.ToArray()
        outstream.Write(buffer, 0, buffer.Length)
        outstream.Flush()
    End Using
End Using
End Using

它构建良好,但是当我启动代码时,我有例外: UnauthorizedAccessException:访问被拒绝。 (例外de HRESULT:0x80070005(E_ACCESSDENIED)) 在线:WindowsRuntimeBufferExtensions.ToArray(blahblah ...... 我想知道出了什么问题。有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我在C#中重写了你的方法来尝试一下:

var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip");

using (var zipMemoryStream = new MemoryStream())
{
    using (var zipArchive = new System.IO.Compression.ZipArchive(zipMemoryStream, System.IO.Compression.ZipArchiveMode.Create))
    {
        foreach (var fileToCompress in (await ApplicationData.Current.TemporaryFolder.GetFilesAsync()))
        {
            var buffer = WindowsRuntimeBufferExtensions.ToArray(await FileIO.ReadBufferAsync(fileToCompress));
            var entry = zipArchive.CreateEntry(fileToCompress.Name);
            using (var entryStream = entry.Open())
            {
                await entryStream.WriteAsync(buffer, 0, buffer.Length);
            }
        }
    }

    using ( var zipStream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
    {
        using (var outstream = zipStream.AsStreamForWrite())
        {
            var buffer = zipMemoryStream.ToArray();
            outstream.Write(buffer, 0, buffer.Length);
            outstream.Flush();
        }
    }
}

它完美无缺 - 它按预期在本地文件夹中创建zip文件。由于您在ToArray调用中遇到异常,原因可能是您尝试打开的文件已从其他位置锁定。如果您自己创建这些文件或甚至只访问它们,请确保关闭流。

要测试此方法,您可以手动在临时文件夹中创建一个文件夹,在其中放入几个文件,然后在该文件夹上运行该方法(文件位于C:\Users\<Username>\AppData\Local\Packages\<PackageName>\TempState)只是为了排除任何其他原因错误。