Zipファイルの内容を読み込み、解凍しようとしています。Zipファイルを解凍するときにParallel.ForEachが例外をスローする
var allZipEntries = ZipFile.Open(zipFileFullPath, ZipArchiveMode.Read).Entries;
ここで、使用しているForeachループを抽出すると、これは問題なく動作します。欠点は、zip.extractメソッドと同等であり、すべてのファイルを展開しようとすると利点がありません。今
foreach (var currentEntry in allZipEntries)
{
if (currentEntry.FullName.Equals(currentEntry.Name))
{
currentEntry.ExtractToFile($"{tempPath}\\{currentEntry.Name}");
}
else
{
var subDirectoryPath = Path.Combine(tempPath, Path.GetDirectoryName(currentEntry.FullName));
Directory.CreateDirectory(subDirectoryPath);
currentEntry.ExtractToFile($"{subDirectoryPath}\\{currentEntry.Name}");
}
}
はParallel.forEachを使用してみましたTPLを活用するために、それは次の例外を投げます:型 'System.IO.InvalidDataException' の例外がSystem.IO.Compressionで発生した
。 dllがユーザーコードで処理されませんでした
追加情報:ローカルファイルヘッダーが破損しています。
Parallel.ForEach(allZipEntries, currentEntry =>
{
if (currentEntry.FullName.Equals(currentEntry.Name))
{
currentEntry.ExtractToFile($"{tempPath}\\{currentEntry.Name}");
}
else
{
var subDirectoryPath = Path.Combine(tempPath, Path.GetDirectoryName(currentEntry.FullName));
Directory.CreateDirectory(subDirectoryPath);
currentEntry.ExtractToFile($"{subDirectoryPath}\\{currentEntry.Name}");
}
});
そして、私はロックを使用することができ、これを回避するために、それは全体の目的を敗北。
Parallel.ForEach(allZipEntries, currentEntry =>
{
lock (thisLock)
{
if (currentEntry.FullName.Equals(currentEntry.Name))
{
currentEntry.ExtractToFile($"{tempPath}\\{currentEntry.Name}");
}
else
{
var subDirectoryPath = Path.Combine(tempPath, Path.GetDirectoryName(currentEntry.FullName));
Directory.CreateDirectory(subDirectoryPath);
currentEntry.ExtractToFile($"{subDirectoryPath}\\{currentEntry.Name}");
}
}
});
ファイルを抽出するのに他の方法がありますか?
問題は、1つのzipファイルを読み込んでおり、そのファイルを並列に抽出しようとしていることです。あなたができることは、それをメモリに読み込んでから並列に抽出することです。しかし、ウィンドウがディスクに当たる行の最後では、書き込みIOはまだ並行しないでしょう。 – rolls