Как справиться с распаковкой ZipFile со слишком длинными/дублирующими путями

При распаковке файлов в Windows у меня иногда возникают проблемы с путями

  1. , которые слишком длинны для Windows (но это нормально в оригинальной ОС, которая создала файл) .
  2. которые являются «дубликатами» из-за нечувствительности к регистру.

При использовании DotNetZip вызов ZipFile.Read(path)будет давать сбои при чтении zip-файлов с одной из этих проблем. А это значит, что я даже не могу попытаться его отфильтровать.

using (ZipFile zip = ZipFile.Read(path))
{
    ...
}

Как лучше всего обращаться с такими файлами?

Обновлено:

Пример zip отсюда: https://github.com/MonoReports/MonoReports/zipball/master

Дубликаты: https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DataSourceType.cs https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DatasourceType.cs

Вот более подробная информация об исключении:

Ionic.Zip.ZipException: невозможно прочитать это как Zip-файл
---> System.ArgumentException: элемент > с таким же ключом уже добавлен.
в System.ThrowHelper.ThrowArgumentException (ресурс ExceptionResource)
в System.Collections.Generic.Dictionary 2.Insert(ключ TKey, значение TValue, логическое добавление)
в System.Collections.Generic.Dictionary
2.Добавить(ключ TKey, значение TValue)
в Ionic.Zip.ZipFile.ReadCentralDirectory(ZipFile zf)
в Ionic.Zip.ZipFile.ReadIntoInstance(ZipFile zf)

Разрешение:

Основываясь на предложении @Cheeso, я могу читать все из потока, избегая дубликатов и проблем с путями:

//using (ZipFile zip = ZipFile.Read(path))
using (ZipInputStream stream = new ZipInputStream(path))
{
    ZipEntry e;
    while( (e = stream.GetNextEntry()) != null )
    //foreach( ZipEntry e in zip)
    {
        if (e.FileName.ToLower().EndsWith(".cs") ||
            e.FileName.ToLower().EndsWith(".xaml"))
        {
            //var ms = new MemoryStream();
            //e.Extract(ms);
            var sr = new StreamReader(stream);
            {
                //ms.Position = 0;
                CodeFiles.Add(new CodeFile() { Content = sr.ReadToEnd(), FileName = e.FileName });
            }
        }
    }
}

10
задан gameweld 27 May 2012 в 05:17
поделиться