SharpCompress解压锁文件

时间:2013-03-05 19:40:59

标签: c# locking

我试图创建一个过程,我使用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循环之后删除,我可以删除除最后一组文件之外的所有文件,如果有多个文件。如果它只是一个相同的问题,因为最后一组文件似乎没有“解锁”。

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

3 个答案:

答案 0 :(得分: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;
            }
        }
    }

答案 1 :(得分:0)

默认情况下(可能是一个缺陷)是我让Streams打开,因为我自己没有创建它们。但是,.NET框架通常会使用StreamReader等内容破坏此规则,因此预计它们将被关闭。

我在想我会改变这种行为。在此期间,你应该能够通过调用它来解决这个问题:

RarReader.Open(extractionPackage.ExtractionFiles.Select(p => File.OpenRead(p.FullPath)), Options.None)

答案 2 :(得分:0)

我遇到了类似的麻烦。我使用SharpCompress在存档中添加文件,我需要在存档后删除文件。我曾尝试使用using(){}进行换行 - 但是这个解决方案在我的情况下并没有起作用。当我添加到我的代码Application.DoEvents()时 - 它解决了问题。