2012-11-27 81 views
2

我对WinRT开发平台有点新了,它已经让我发疯了(我是一个长期的.Net开发人员,所有那些被删除的API都很烦人) I'当压缩存在于Windows.Storage.ApplicationData.Current.TemporaryFolder中的所有文件时遇到问题。这里是我当前的代码(VB.Net,基于MSDN代码,“file”是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:拒绝访问。 (例外德HRESULT:0X80070005(E_ACCESSDENIED)) 在线:?!WindowsRuntimeBufferExtensions.ToArray(blahblah ... 我不知道什么是错的任何想法

在此先感谢

回答

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电话得到的异常,其原因可能是该文件你想。 open已经被其他地方锁住了,如果你正在创建这些f你自己或者只是访问它们,确保你关闭了这些流。

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

+0

非常感谢!我注意到我忘记关闭文件流,这让Windows认为它们仍然在使用。 – user1857763

相关问题