2

私は 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 : Access denied. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIED)) オンライン : WindowsRuntimeBufferExtensions.ToArray(blahblah... 何が問題なのか疑問に思っています。

前もって感謝します !

4

1 に答える 1

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) でメソッドを実行して、他のエラーの理由を除外します。

于 2012-11-28T06:04:00.827 に答える