我在.net 4.0中使用DirectoryInfo和FileInfo来枚举目录树中的文件,我打到PathTooLongException。 简体版如下
public static class Test { public static void Search(DirectoryInfo base) { foreach(var file in base.GetFiles()) { try { Console.WriteLine(file.FullName); } catch(PathTooLongException ex) { // What path was this? } } foreach(var dir in base.GetDirectories()) { Search(dir); } } }
当错误被抛出时,我想知道什么文件path导致了这个问题。 显然,我不能要求FullName因为这是错误的。 我可以从file.Name得到名称,但是如果我不能得到path的其余部分作为file.Directory给出了一个PathTooLongException即使DirectoryInfo文件被发现工作正常! (我不能使用,但实际的代码要复杂得多)。
通过堆栈跟踪来看,它似乎是使用一个内部path(我看到一个受保护的file.FullPath从debugging),并试图从完整(超大)的path撕裂的目录。 大部分的问题似乎涉及到System.IO.Path.normalizePath ,我听说在.Net 4.0中经历了一些改变。 我还没有尝试过以前的版本的框架。
我的问题:
是否有任何技巧来计算文本文件中的行数?
启动一个执行委托的新进程
在Linux上运行ASP Classic和.NET
DataGridView不填充
input语言挂钩
我怎样才能从这个例外中得到完整的path; 似乎没有任何有用的信息通过。
为什么框架需要限制path中的字符来切断文件名?
提前感谢您的帮助,
安迪
带有通配符的.NET DirectoryInfo.GetFiles在不同的驱动器上有不同的含义
如何检测SD卡何时插入?
我怎样才能捕捉到另一个进程的未处理的exception?
机器在.NET中的域名?
特定networking接口IPv4可用性 – 无连接,本地,Internet
除了使用反射,或者使用库或P / Invoke来使用支持长路径的Windows API并手动检查长度之外,我无法想象其他任何方式。 完整路径存储在名为FullPath的protected string字段中
foreach(var dir in new DirectoryInfo (@"D:longpaths") .GetFileSystemInfos("*.*",SearchOption.AllDirectories)) { try { Console.WriteLine(dir.FullName); } catch (PathTooLongException) { FieldInfo fld = typeof(FileSystemInfo).GetField( "FullPath",BindingFlags.Instance | BindingFlags.NonPublic); Console.WriteLine(fld.GetValue(dir)); // outputs your long path } }
如果你试图用文件做一些事情,而不是仅仅检查文件的长度,那么我会建议你使用像BCL团队这样的一个库,但是它不会创建DirectoryInfos , FileInfo或者FileSystemInfo ,只有字符串。 所以它可能不是你的代码似乎替代你的代码。
至于你的第二个问题的答案,我建议阅读这篇博客文章处理.NET中的长路径。 这是一个引用,解释了为什么他们没有很快在.NET中添加长路径支持。
很少有人抱怨32K的限制,所以问题解决了? 不完全的。 有几个原因,我们不愿意在过去添加长路径,为什么我们仍然很小心,涉及安全性, API语法中的不一致的支持,以及应用程序的兼容性。
这是一个由3部分组成的系列文章,解释了为什么API是这样的以及为什么限制在那里的一些原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。