public static void Main()
{
// testing file name
var fileName =
"\\\\server7\\EmailAttachments\\myfolder\\abc\\2012\\1126\\e85c6b82-edc5-4ce1-9ad0-8025b92d0105-o.dom=38c55279fe168c290fb2b06a312b5d88&b=6f54a59ce903eeaff197f82937de4012.dom=38c55279fe168c290fb2b06a312b5d88&b=6f54a59ce903eeaff197f82937de4012=6f54a59ce903eeaff197f82937de4012.dom=38c55279fe168c290fb2b06a312b5d88&b=6f54a59ce903eeaff197f82937de4012";
var directory = fileName.GetDirectory();
}
public static string GetDirectory(this string fullyQualifiedFileName)
{
return Path.GetDirectoryName(fullyQualifiedFileName); // throwing exception here
}
Run Code Online (Sandbox Code Playgroud)
低于例外
发生System.IO.PathTooLongException HResult = -2147024690
Message =指定的路径,文件名或两者都太长.完全限定的文件名必须少于260个字符,目录名必须少于248个字符.Source = mscorlib
StackTrace:在System.IO.Path.NormalizePath(String path,Boolean fullCheck,Int32 maxPathLength,Boolean expandShortPaths)的System.IO.Path.GetDirectoryName(String path)处于Sameer.FilePathExtension.GetDirectory(String fullyQualifiedFileName)in f :\ Practice Projects\Sameer\Sameer\FilePathExtension.cs:第137行InnerException:
我想知道为什么GetDirectoryName必须依赖于路径或文件名字符限制.
如msdn网站所述
"完整路径不得超过260个字符,以保持与Windows操作系统的兼容性"
http://msdn.microsoft.com/en-us/library/system.io.pathtoolongexception(v=vs.100).aspx
以及它背后的原因你可以在这里找到,如下面的链接所示.
另一个问题是暴露长路径支持会导致不一致的行为.带有\?\前缀的长路径可用于大多数与文件相关的Windows API,但不能用于所有Windows API.例如,如果文件名长于MAX_PATH,则将模块映射到调用进程的地址的LoadLibrary将失败.所以这意味着MoveFile将允许您将DLL移动到一个位置,使其路径超过260个字符,但是当您尝试加载DLL时,它将失败.整个Windows API都有类似的例子; 存在一些变通方法,但它们是逐案处理的.
另一个被认为更像是一个痛苦因素的因素是与其他基于Windows的应用程序和Windows shell本身的兼容性,它们仅适用于短于MAX_PATH的路径(请注意,Vista shell试图软化此限制,下面简要介绍) .这意味着如果.NET支持长路径,那么我们将允许您创建无法通过资源管理器或命令提示符访问的文件.
也就是说,我们意识到强制执行260个字符限制并不是一个合理的长期解决方案.我们的客户不会经常遇到这个问题,但是当他们这样做时,他们会非常不方便.可能的解决方法是P /调用Windows API并使用\?\前缀,但是复制System.IO中的功能将需要大量代码.因此,为了解决这个问题,客户经常采用目录组织的大修,人为地缩短目录名称(并更新每个引用位置).
http://blogs.msdn.com/b/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx
| 归档时间: |
|
| 查看次数: |
2158 次 |
| 最近记录: |