【问题标题】:C# How can I solve limitations when using DirectoryInfo?C# 使用 DirectoryInfo 时如何解决限制?
【发布时间】:2012-03-23 22:53:41
【问题描述】:

当我递归浏览一些文件夹和文件时,我遇到了这个错误:

指定的路径、文件名或两者都太长。完全限定的文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。

这是我的功能

private void ProcessDirectory(DirectoryInfo di)
{
    try
    {
        DirectoryInfo[] diArr = di.GetDirectories();

        foreach (DirectoryInfo directoryInfo in diArr)
        {
            if (StopCheck)
                    return;
            ProcessDirectory(directoryInfo);
        }
        ProcessFile(di);
    }
    catch (Exception e)
    {
        listBoxError.Items.Add(e.Message);
    }

    TextBoxCurrentFolder.Text = di.ToString();
}

我不能缩短目录名称,因为我也不允许这样做...我该如何解决这个问题?

添加: 这是另一个函数:

private void ProcessFile(DirectoryInfo di)
{
    try
    {
        FileInfo[] fileInfo = di.GetFiles();

        if (fileInfo.LongLength != 0)
        {
            foreach (FileInfo info in fileInfo)
            {
                Size += info.Length;
                CountFile++;
            }
        }
    }
    catch (Exception e)
    {
        listBoxError.Items.Add(e.Message);
    }
}

编辑 在他使用 Zeta Long Paths 的地方找到了这个: How can I use FileInfo class, avoiding PathTooLongException?

已经实现了,现在我要让程序运行一夜,看看它是否有效。

编辑 昨天使用了 ZetaLongPath,效果很好!它甚至会遍历需要权限访问的文件夹。

编辑 而不是zetalongPath,我使用了我认为更好的Delimon.Win32.IO.dll。和Win32的界面一样。

【问题讨论】:

  • 我猜你必须回到普通的 Windows API (FindFirst*/FindNext*)
  • 那么错误是从ProcessFile()内部发生的,如果我们能看到,也许可以更改代码?
  • 你知道在开始处理文件之前你是第一个到最深的子文件夹吗?!如果您想从根文件夹开始,您应该将 ProcessFile(di); 移动到方法的开头。
  • Musefan:不,问题不会在那里发生。当然 :) 添加了功能
  • 蒂姆:是的,我知道,有人告诉我应该从最深处开始。

标签: c# .net directoryinfo


【解决方案1】:

这里有更多关于前面提到的 Delimon 库的信息。它是 Microsoft TechNet 上基于 .NET Framework 4 的库,用于克服长文件名问题:

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 库出错。

【讨论】:

  • 这是另一种可能的替代方案,称为 AlphaFS:github.com/alphaleonis/AlphaFS
  • @TripleAntigen 优秀的员工,开源。 Delimon.Win32.IO 似乎来自一家公司。 AlphaFS 可能有错误,但对我来说使用 Directory.GetFiles(,,SearchOption.AllDirectories) 效果很好。下载并内置VS2017,为NetFx45/46/47/20生成dll,用于VS2019
【解决方案2】:

我还建议阅读来自 BCL 团队的 three-part blog post,它于 2007 年发布,但具体涉及 DirectoryInfo 在深度嵌套文件夹方面的限制。它涵盖了 MAX_PATH 限制的历史、较新的 \?\ 路径格式以及各种基于 .NET 的解决方案和变通方法。

全面,虽然可能有点过时。

【讨论】:

    【解决方案3】:

    您必须使用 P/Invoke 和 Unicode 版本的 Win32 API 函数。您将需要 FindFirstFileFindNextFileFindClose 函数。

    另见:

    【讨论】:

      【解决方案4】:

      您可以使用subst 命令。它从您作为参数传递的任何文件夹开始创建一个虚拟驱动器。

      例如,您可以将路径 c:\aaaaaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaaaa 转入驱动器 R: 并继续探索 c:\aaaaaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaaaaaaaaaaaa\aaaaaaaaaaaa 到 R: 的子文件夹...

      你知道我的意思吗?

      【讨论】:

        【解决方案5】:

        这是 Windows 中的一个已知限制:http://msdn.microsoft.com/en-us/library/aa365247.aspx

        我不相信你能绕过它,所以无论谁告诉你不能让它们变短,你都会有一个非常可靠的论据来解释为什么必须这样做。

        唯一真正的选择是将深层文件夹移动到其他地方,可能就在驱动器的根目录。

        编辑:实际上可能有一个解决方法:http://www.codinghorror.com/blog/2006/11/filesystem-paths-how-long-is-too-long.html

        【讨论】:

          猜你喜欢
          • 2012-10-29
          • 2010-11-16
          • 2021-12-20
          • 1970-01-01
          • 1970-01-01
          • 2022-08-14
          • 2015-12-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多