【发布时间】:2009-08-31 13:01:28
【问题描述】:
如何使用(避免 PathTooLongException):
System.IO.FileInfo
路径大于 260 个字符?
是否有类似的类/方法返回与 FileInfo 类相同的结果?
【问题讨论】:
如何使用(避免 PathTooLongException):
System.IO.FileInfo
路径大于 260 个字符?
是否有类似的类/方法返回与 FileInfo 类相同的结果?
【问题讨论】:
据我所知,这并不容易。虽然可以使用 phoenix 提到的流的解决方法,但文件名处理是不可能的。在内部,每个使用文件名的类都会检查长文件名。
您可以实例化 FileInfo 并使用反射填充私有成员(但不建议这样做)并让 FileInfo 指向具有长路径的文件。但是当您尝试使用此对象时,您仍然会收到 PathTooLongException 异常,因为例如,Path 类(被 FileInfo 大量使用)检查每个方法调用的长路径。
因此,只有一种正确的方法可以获得无问题的长路径支持 - 实现您自己的一组模仿 FileInfo 行为的类。它不是很复杂(可能只有安全性),但很耗时。
更新:这里甚至有两个现成的解决方案来解决这个问题:AlpfaFS 和 Zeta Long Paths
【讨论】:
FindFirstFile API 调用是复制 FileInfo 的关键元素。
在工作中,我们经常处理长路径,因此我们基本上必须滚动我们自己的 System.IO 来完成它。不是真的,但我们重写了 File、Directory、FileInfo、DirectoryInfo 和 Path,仅举几例。基本前提是,从 Win32 API 的角度来看,这一切都是可能的,所以最终您真正需要做的就是调用 Win32 API 函数的 Unicode 版本,然后就可以了。工作量很大,有时可能会让人头疼,但确实没有更好的方法。
【讨论】:
Microsoft TechNet 上有一个很棒的库可以解决长文件名问题,它被称为 Delimon.Win32.IO Library (V4.0) 并且它有自己的 System.IO 中的关键方法版本
例如,您将替换:
System.IO.Directory.GetFiles
与
Delimon.Win32.IO.Directory.GetFiles
这将让您处理长文件和文件夹。
来自网站:
Delimon.Win32.IO 替换了 System.IO 的基本文件功能和 支持最多 32,767 个字符的文件和文件夹名称。
这个库是在 .NET Framework 4.0 上编写的,可以使用 在 x86 和 x64 系统上。标准的文件和文件夹限制 System.IO 命名空间可以处理包含 260 个字符的文件 文件名和文件夹名称中的 240 个字符(MAX_PATH 通常为 配置为 260 个字符)。通常你会遇到 System.IO.PathTooLongException 标准 .NET 库出错。
【讨论】:
我只需要使用 FullName 属性,但也收到了 PathTooLongException。
使用反射提取FullPath值足以解决我的问题:
private static string GetFullPath(FileInfo src)
{
return (string)src.GetType()
.GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic)
.GetValue(src);
}
【讨论】: