2

私は VS2012、WinRT、および C# で作業しています。

ファイルを解凍した後、いくつかのファイルを削除しようとしています。「アクセスが拒否されました」というエラーが表示されます。アプリを停止して再起動すると、同じコードが正常に機能するため、ハンドルがまだ接続されているように見えます。

unZipFile メソッドを呼び出さなければ、ファイルを削除できます。

ファイルを解放する決定的な方法はありますか? delete を呼び出す前に null (file = null;) に設定しました。

unzip メソッドを呼び出すコード ブロックは次のとおりです。

    StorageFile file = await CreateOutputFile(fileName, path);

        MemoryStream theMemStream = new MemoryStream();

        theMemStream.Write(bytes, 0, bytes.Length);

        await FileIO.WriteBytesAsync(file, bytes);

        await theMemStream.FlushAsync();
        theMemStream.Dispose();

        var result = await unZipFile(file, path);

        file = null;

unZipFile メソッドは次のとおりです。

        private async Task<string> unZipFile(StorageFile file, string path)
        {

        StorageFolder sf = await GetOutputFolder(path);

    using (var zipStream = await file.OpenStreamForReadAsync())
    {
        using (MemoryStream zipMemoryStream = new MemoryStream((int)zipStream.Length))
        {

            await zipStream.CopyToAsync(zipMemoryStream);

            try
            {
                var archive = SharpCompress.Archive.ArchiveFactory.Open(file.Path);

                foreach (var entry in archive.Entries)
                {
                    entry.WriteTo(zipMemoryStream);

                    Stream fileData = entry.OpenEntryStream();

                    StorageFile outputFile = await sf.CreateFileAsync(entry.FilePath, CreationCollisionOption.ReplaceExisting);

                    using (Stream outputFileStream = await outputFile.OpenStreamForWriteAsync())
                    {
                        await fileData.CopyToAsync(outputFileStream);
                        await outputFileStream.FlushAsync();
                        outputFileStream.Dispose();
                    }
                }
                archive = null;
            }
            catch (Exception ex)
            {
                throw new IOException("Error writing decompressed output file: " + ex.Message);
            }

            await zipStream.FlushAsync();
            zipStream.Dispose();

            await zipMemoryStream.FlushAsync();
            zipMemoryStream.Dispose();
        }
    }

    return "success";
}

削除方法はこちら。これは、解凍後に各ファイルに対して呼び出されます。

private async Task<string> deleteFile(string path, string filename)
{
    StorageFolder folder = await GetOutputFolder(path);

    var files = await folder.GetFilesAsync();

    foreach (StorageFile file in files)
    {
        try
        {
            if (file != null)
            {
                if (file.Name == filename)
                    await file.DeleteAsync();
            }
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
    return "success";
}
4

1 に答える 1

3

どのファイルで例外が発生しますか、抽出されたファイルまたはzipアーカイブ自体ですか?

後者の場合は、を継承するArchiveFactory.Open()anを返すため、使用後に破棄されるようにブロックでラップする必要があります。IArchiveIDisposablevar archive = SharpCompress.Archive.ArchiveFactory.Open(file.Path);using

于 2012-11-09T16:20:39.010 に答える