0

我试图创建一个过程,使用 SharpCompress 解压缩一组 rar 文件,然后删除它们。

我首先有一个 foreach 循环,它遍历要解压缩的不同文件集,如下所示:

foreach (var package in extractionPackages.Where(package => Extractor.ExtractToFolder(package, destinationFolder)))
        {
            FileHelper.DeleteExtractionFiles(package);
        }

提取过程直接采用 SharpCompress 测试代码,如下所示:

public static bool ExtractToFolder(ExtractionPackage extractionPackage, string extractionPath)
    {
        var fullExtractionPath = Path.Combine(extractionPath, extractionPackage.FolderName);
        try
        {
            using (var reader = RarReader.Open(extractionPackage.ExtractionFiles.Select(p => File.OpenRead(p.FullPath))))
            {
                while (reader.MoveToNextEntry())
                {
                    reader.WriteEntryToDirectory(fullExtractionPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                }

            }

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

正如您在第一个代码块中看到的那样,我然后调用删除文件,但由于文件被另一个进程锁定,我收到一个错误: 该进程无法访问文件'file.rar',因为它正在被使用另一个过程。

如果我尝试在 foreach 循环之后进行删除,如果有多个文件,我可以删除除最后一组文件之外的所有文件。如果它只是一个相同的问题,因为最后一组文件似乎没有被“解锁”。

如何构建代码以解锁文件?

4

3 回答 3

2

通过使用 Nunrar 的示例并对其进行一些修改,我似乎终于解决了这个问题:

public static bool ExtractToFolder(ExtractionPackage extractionPackage, string extractionPath)
    {
        var fullExtractionPath = Path.Combine(extractionPath, extractionPackage.FolderName);

        try
        {
            using (var reader = RarReader.Open(GetStreams(extractionPackage)))//extractionPackage.ExtractionFiles.Select(p => File.OpenRead(p.FullPath)), Options.None))
            {
                while (reader.MoveToNextEntry())
                {
                    reader.WriteEntryToDirectory(fullExtractionPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                }
            }

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

    private static IEnumerable<Stream> GetStreams(ExtractionPackage package)
    {
        foreach (var item in package.ExtractionFiles)
        {
            using (Stream input = File.OpenRead(item.FullPath))
            {
                yield return input;
            }
        }
    }
于 2013-03-10T12:51:47.407 回答
0

默认情况下(可能是一个缺陷)是我将 Streams 保持打开状态,因为我没有自己创建它们。但是,.NET 框架通常会用 StreamReader 等东西打破这个规则,所以预计它们会被关闭。

我想我要改变这种行为。同时,您应该能够通过调用以下方法自己解决此问题:

RarReader.Open(extractionPackage.ExtractionFiles.Select(p => File.OpenRead(p.FullPath)), Options.None)
于 2013-03-06T16:12:50.020 回答
0

我也有类似的麻烦。我使用 SharpCompress 在存档中添加文件,我需要在存档后删除文件。我曾尝试使用 using() {} 包装流 - 但此解决方案不适用于我的情况。当我添加到我的代码 Application.DoEvents() - 它解决了这个问题。

于 2016-11-28T20:29:12.320 回答