Я использую System.IO.Compression для извлечения содержимого некоторых файлов Zip. Проблема в том, что всякий раз, когда есть запись с именем файла, содержащим некоторые недопустимые символы Windows, возникает исключение. Я пробовал несколько вещей, но так и не нашел способа игнорировать плохие записи и извлечь хорошие. Пожалуйста, учтите, что изменение содержимого zip-файла невозможно для типа выполняемой нами обработки, поэтому я должен обработать файл как есть.
Система обычно обрабатывает файлы с несколькими записями, это число является переменным, но может быть до 300 записей в одном zip-файле, а иногда будет запись с именем файла, таким как 'myfile<name>.txt'
, которое содержит угловые скобки, которые явно являются недопустимыми символами. для Windows. Я действительно хочу проигнорировать эту запись и перейти к извлечению остальных записей в ZipArchive. Но похоже, что это невозможно.
Любая идея о том, как игнорировать плохие записи ZipArchive?
До сих пор я пробовал разные вещи, чтобы получить записи отдельно, но я всегда получаю одну и ту же ошибку исключения.
Вот некоторые из вещей, которые я пробовал до сих пор:
Реализация обычного способа перебора записей:
foreach (ZipArchiveEntry entry in ZipArchive.Entries)
Попытка получить только одну запись по индексу (здесь такое же исключение, хотя первая запись действительна):
ZipArchiveEntry entry = ZipArchive.Entries[0]
Применение фильтра с использованием лямбда-выражения для игнорирования недопустимых записей (также такое же исключение):
var entries = zipArchive.Entries.Where(a => a.FullName.IndexOfAny(Path.GetInvalidFileNameChars() ) == -1);
Ничего из этого не помогает, и исключение, которое я получаю каждый раз, выглядит следующим образом:
в System.IO.Path.CheckInvalidPathChars(строковый путь, логический checkAdditional) в System.IO.Path.GetFileName(строковый путь) в System.IO.Compression.ZipHelper.EndsWithDirChar(строковый тест) в System.IO.Compression.ZipArchiveEntry. set_FullName(строковое значение) в System.IO.Compression.ZipArchiveEntry..ctor(архив ZipArchive, ZipCentralDirectoryFileHeader cd) в System.IO.Compression.ZipArchive.ReadCentralDirectory() в System.IO.Compression.ZipArchive.get_Entries() в ZipLibraryConsole. MicrosoftExtraction.RecursiveExtract(Stream fileToExtract, Int32 maxDepthLevel, Attachment att) в C:\Users\myUser\Documents\Visual Studio 2015\Projects\ZipLibraryConsole\ZipLibraryConsole\MicrosoftExtraction.cs:строка 47
Это фрагмент реализованного кода:
var zipArchive = new ZipArchive(fileToExtract, ZipArchiveMode.Read);
try
{
foreach (var zipEntry in zipArchive.Entries) // the exception is thrown here, there is no chance to process valid entries at all
{
// Do something and extract the file
}
catch (ArgumentException exception)
{
Console.WriteLine(
String.Format("Failed to complete the extraction. At least one path contains invalid characters for the Operating System: {0}{1}", att.Name, att.Extention));
}