Jak radzić sobie z rozpakowywaniem ZipFile za pomocą ścieżek, które są zbyt długie / powielone
Podczas rozpakowywania plików w systemie Windows czasami mam problemy ze ścieżkami
są zbyt długie dla systemu Windows (ale w porządku w oryginalnym systemie operacyjnym, który utworzył plik).które są „duplikowane” z powodu niewrażliwości na wielkość literUżywając DotNetZip, theZipFile.Read(path)
wywołanie będzie się rozpadać przy każdym odczycie plików zip z jednym z tych problemów. Co oznacza, że nie mogę nawet spróbować go odfiltrować.
using (ZipFile zip = ZipFile.Read(path))
{
...
}
Jak najlepiej radzić sobie z czytaniem tego rodzaju plików?
Zaktualizowano:
Przykładowy zip tutaj:https://github.com/MonoReports/MonoReports/zipball/master
Duplikaty:https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DataSourceType.cs https://github.com/MonoReports/MonoReports/tree/master/src/MonoReports.Model/DatasourceType.cs
Oto więcej szczegółów na temat wyjątku:
Ionic.Zip.ZipException: Nie można odczytać tego jako pliku ZipFile
---> System.ArgumentException:> element z tym samym kluczem został już dodany.
at System.ThrowHelper.ThrowArgumentException (zasób ExceptionResource)
w System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)<br>at System.Collections.Generic.Dictionary
2.Dodaj (klucz TKey, wartość TValue)
at Ionic.Zip.ZipFile.ReadCentralDirectory (ZipFile zf)
at Ionic.Zip.ZipFile.ReadIntoInstance (ZipFile zf)
Rozkład:
Na podstawie sugestii @ Cheeso mogę przeczytać wszystko ze strumienia, tych, którzy unikają duplikatów, i problemów ze ścieżką:
//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 });
}
}
}
}