При распаковке файлов в Windows у меня иногда возникают проблемы с путями
- это слишком долго для Windows (но нормально в оригинальной ОС, которая создала файл).
- которые являются «дубликатами» из-за нечувствительности к регистру
При использовании 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: невозможно прочитать это как ZipFile
---> System.ArgumentException: > элемент с таким же ключом уже добавлен.
в System.ThrowHelper.ThrowArgumentException(ресурс ExceptionResource)
в System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)
2.Add(ключ TKey, значение TValue)
at System.Collections.Generic.Dictionary
в 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 });
}
}
}
}