我对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 ...... 我想知道出了什么问题。有什么想法吗?
提前致谢!
答案 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
)只是为了排除任何其他原因错误。