0

SharpCompressを使用してrarファイルのセットを解凍してから削除するプロセスを作成しようとしています。

最初に、次のように解凍するさまざまなファイルのセットをループするforeachループがあります。

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

抽出プロセスは、SharpCompress Testsコードから直接取得され、次のようになります。

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ループの後に削除を入れようとすると、複数のファイルがある場合は、最後のファイルセットを除くすべてを削除できます。それが1つだけの場合、最後のファイルセットが「ロック解除」されていないように見えるため、同じ問題が発生します。

ファイルのロックが解除されるようにコードを構造化するにはどうすればよいですか?

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

デフォルト(そしておそらく欠陥)は、自分でストリームを作成しなかったため、ストリームを開いたままにしておくことです。ただし、.NET Frameworkは通常、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 に答える