首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PathTooLongException检索路径信息

从PathTooLongException检索路径信息
EN

Stack Overflow用户
提问于 2012-03-06 17:51:16
回答 1查看 2.9K关注 0票数 3

我正在使用DirectoryInfo和FileInfo在.Net 4.0中枚举目录树中的文件,并点击PathTooLongException。简化后的版本如下

代码语言:javascript
复制
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);
        }
    }
}

当抛出错误时,我想知道是什么文件路径导致了问题。显然,我不能要求FullName,因为这是错误的。我可以从file.Name获得名称,但是如果我不能获得路径的其余部分,因为file.Directory给出了一个PathTooLongException,即使该文件是从工作良好的DirectoryInfo中找到的!(但我不能使用它,因为实际的代码要复杂得多)。

从堆栈跟踪中可以看出,它使用的似乎是内部路径(我从调试中看到了受保护的file.FullPath ),并试图从完整(超大)路径中删除目录。大多数问题似乎都与System.IO.Path.NormalizePath有关,我听说.Net 4.0中发生了一些变化。我还没有尝试过该框架的以前版本。

我的问题:

  1. 我如何从这个异常中获得完整的路径;它似乎是在没有任何有用信息的情况下传递的。
  2. 为什么框架需要限制路径中的字符来删除文件名?

谢谢你的帮忙,

安迪

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-06 18:03:33

除了使用反射,或者使用库或P/Invoke来使用支持长路径和手动检查长度的Windows之外,我想不出任何其他方法。完整路径存储在一个名为protected stringFullPath字段中。

代码语言:javascript
复制
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团队这样的库,但是它不会创建DirectoryInfosFileInfoFileSystemInfo,只创建字符串。因此,它可能不是您的代码的插入替代。

至于你的第二个问题的答案,我建议阅读这篇博客文章来处理.NET中的长路径,这是一个引用,解释了为什么在.NET中添加长路径支持还不够快。

很少有人抱怨32K的限制,那么,问题解决了吗?不完全是。过去我们不愿意添加长路径的原因有几个,以及为什么我们仍然对它保持谨慎,这涉及到安全性、\\语法的Windows API中不一致的支持以及应用程序兼容性。

这是一个由3部分组成的系列文章,并解释了为什么API是这样的,以及为什么存在限制。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9589146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档