Como lidar com o ZipFile de descompactação com caminhos muito longos / duplicados

Ao descompactar arquivos no Windows, ocasionalmente terei problemas com caminhos

que são muito longos para o Windows (mas tudo bem no sistema operacional original que criou o arquivo).que são "duplicados" devido a insensibilidade a maiúsculas e minúsculas

Usando DotNetZip, oZipFile.Read(path) a chamada irá cagar sempre que ler arquivos zip com um desses problemas. O que significa que não posso nem tentar filtrar.

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

Qual é a melhor maneira de lidar com esses tipos de arquivos?

Atualizada:

Exemplo de zip daqui:https://github.com/MonoReports/MonoReports/zipball/master

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

Aqui está mais detalhes sobre a exceção:

Ionic.Zip.ZipException: Não é possível ler isso como um ZipFile
---> System.ArgumentException: Um item> com a mesma chave já foi adicionado.
em System.ThrowHelper.ThrowArgumentException (recurso ExceptionResource)
em System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)<br>at System.Collections.Generic.Dictionary2.Adicionar (chave TKey, valor de TValue)
em Ionic.Zip.ZipFile.ReadCentralDirectory (ZipFile zf)
em Ionic.Zip.ZipFile.ReadIntoInstance (ZipFile zf)

Resolução:

Com base na sugestão do @ Cheeso, posso ler tudo do fluxo, os que evitam duplicatas e problemas de caminho:

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

questionAnswers(2)

yourAnswerToTheQuestion