2

我在 VS2012、WinRT 和 C# 中工作。

我试图在解压缩后删除一些文件。我收到“访问被拒绝”错误。如果我停止应用程序并重新启动它,相同的代码可以正常工作,因此看起来仍然连接着一个句柄。

如果我不调用 unZipFile 方法,我可以删除文件。

是否有明确的方法来发布文件?在调用删除之前,我已将其设置为 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()返回一个IArchivewhich inherits IDisposable,因此您应该将其包装var archive = SharpCompress.Archive.ArchiveFactory.Open(file.Path);在一个using块中,以便在使用后将其处理掉。

于 2012-11-09T16:20:39.010 回答