2012-11-27 167 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

相關問題