Wie gehe ich mit dem Entpacken von ZipFile mit zu langen / doppelten Pfaden um?

Beim Entpacken von Dateien in Windows treten gelegentlich Probleme mit Pfaden auf

Das ist zu lang für Windows (aber in dem ursprünglichen Betriebssystem, das die Datei erstellt hat, in Ordnung).Das sind "Duplikate" aufgrund von Groß- und Kleinschreibung

Mit DotNetZip können dieZipFile.Read(path) Anruf wird scheißen, wenn zip-Dateien mit einem dieser Probleme gelesen werden. Das heißt, ich kann nicht einmal versuchen, es herauszufiltern.

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

Was ist der beste Weg, um solche Dateien zu lesen?

Aktualisierte:

Beispiel zip von hier:https://github.com/MonoReports/MonoReports/zipball/master

Duplikate:https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DataSourceType.cs https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DatasourceType.cs

Hier ist mehr Details zu der Ausnahme:

Ionic.Zip.ZipException: Kann das nicht als ZipFile lesen
---> System.ArgumentException: Ein> Element mit demselben Schlüssel wurde bereits hinzugefügt.
bei System.ThrowHelper.ThrowArgumentException (ExceptionResource-Ressource)
bei System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)<br>at System.Collections.Generic.Dictionary2.Add (TKey-Taste, TValue-Wert)
bei Ionic.Zip.ZipFile.ReadCentralDirectory (ZipFile zf)
bei Ionic.Zip.ZipFile.ReadIntoInstance (ZipFile zf)

Auflösung:

Auf der Grundlage von @ Cheesos Vorschlag kann ich alles aus dem Stream lesen, solche, die Duplikate vermeiden, und Pfadprobleme:

//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 });
            }
        }
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage