Windowsでファイルを解凍すると、パスに問題が発生することがあります
- これはWindowsには長すぎます(ただし、ファイルを作成した元のOSでは問題ありません)。
- 大文字と小文字を区別しないために「重複」している
DotNetZipを使用ZipFile.Read(path)
すると、これらの問題の1つで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 resource)
at System.Collections.Generic.Dictionary 2.Add(TKey key、TValue value) at Ionic.Zip.ZipFile.ReadCentralDirectory(ZipFile zf) at Ionic.Zip.ZipFile.ReadIntoInstance(ZipFile zf)2.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary
解像度:
@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 });
}
}
}
}