- 路径过长(但在创建文件的原始操作系统中是可以的)。
- 由于不区分大小写而“重复”的路径。
ZipFile.Read(path)
将崩溃。这意味着我甚至无法尝试过滤它们。using (ZipFile zip = ZipFile.Read(path))
{
...
}
什么是处理这种文件的最佳方法?
更新:
例如,从这里获取zip文件: https://github.com/MonoReports/MonoReports/zipball/master
Duplicates: 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: 已经添加了具有相同键的项。
at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)
2.Add(TKey key, TValue value)
at System.Collections.Generic.Dictionary
at Ionic.Zip.ZipFile.ReadCentralDirectory(ZipFile zf)
at 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 });
}
}
}
}