Я читаю содержимое zip-файла и пытаюсь его извлечь.
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}");
}
}
Теперь, чтобы воспользоваться преимуществами TPL, попробуйте использовать Parallel.forEach, но это вызывает следующее исключение:
Исключение типа «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}");
}
}
});
Любой другой или лучший способ извлечь файлы?