【问题标题】:How can I use FileInfo class, avoiding PathTooLongException?如何使用 FileInfo 类,避免 PathTooLongException?
【发布时间】:2009-08-31 13:01:28
【问题描述】:

如何使用(避免 PathTooLongException):

System.IO.FileInfo

路径大于 260 个字符?

是否有类似的类/方法返回与 FileInfo 类相同的结果?

【问题讨论】:

    标签: c# exception


    【解决方案1】:

    据我所知,这并不容易。虽然可以使用 phoenix 提到的流的解决方法,但文件名处理是不可能的。在内部,每个使用文件名的类都会检查长文件名。

    您可以实例化 FileInfo 并使用反射填充私有成员(但不建议这样做)并让 FileInfo 指向具有长路径的文件。但是当您尝试使用此对象时,您仍然会收到 PathTooLongException 异常,因为例如,Path 类(被 FileInfo 大量使用)检查每个方法调用的长路径。

    因此,只有一种正确的方法可以获得无问题的长路径支持 - 实现您自己的一组模仿 FileInfo 行为的类。它不是很复杂(可能只有安全性),但很耗时。

    更新:这里甚至有两个现成的解决方案来解决这个问题:AlpfaFSZeta Long Paths

    【讨论】:

    • +1; Zeta Long Paths 链接正是我所需要的。 FindFirstFile API 调用是复制 FileInfo 的关键元素。
    【解决方案2】:

    在工作中,我们经常处理长路径,因此我们基本上必须滚动我们自己的 System.IO 来完成它。不是真的,但我们重写了 File、Directory、FileInfo、DirectoryInfo 和 Path,仅举几例。基本前提是,从 Win32 API 的角度来看,这一切都是可能的,所以最终您真正需要做的就是调用 Win32 API 函数的 Unicode 版本,然后就可以了。工作量很大,有时可能会让人头疼,但确实没有更好的方法。

    【讨论】:

    • 您的新类看起来如何,它们是 100% 手写的还是您在 File 类中继承了内置 File 类?
    • 嗯,File 实际上是一个静态类,所以你不能从它继承,但是你认为子类化的大多数类(FileInfo,DirectoryInfo)都是密封的,所以你不能子类化他们。我们都是从头开始写的。我不会撒谎,我们确实使用了 Reflector ALOT :)
    • @BFree 有趣。有没有可能开源这项工作?我认为可以为全球多个开发人员节省数十小时的时间。
    • @jweyrich 这个答案已经有六年了,我现在离那份工作还很远:-(所以,不,我不能再访问这个代码了。你让我事情虽然这将是一个有趣的副项目开始......现在我只需要找时间:-)
    • @BFree 不用担心 :-) 我正在测试ZetaLongPaths,它似乎满足了我的大部分需求。有时我需要直接使用 Win API - 不是很漂亮,但我可以接受。但这确实是一个很好的副项目!
    【解决方案3】:

    Microsoft TechNet 上有一个很棒的库可以解决长文件名问题,它被称为 Delimon.Win32.I​O 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 库出错。

    【讨论】:

      【解决方案4】:

      我只需要使用 FullName 属性,但也收到了 PathTooLongException。

      使用反射提取FullPath值足以解决我的问题:

      private static string GetFullPath(FileInfo src)
      {
          return (string)src.GetType()
              .GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic)
              .GetValue(src);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        相关资源
        最近更新 更多