10

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

指定的路径、文件名或两者都太长。完全限定的文件名必须少于 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 的地方找到了这个: 如何使用 FileInfo 类,避免 PathTooLongException?

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

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

编辑 而不是zetalongPath,我使用了我认为更好的Delimon.Win32.IO.dll。它具有与 Win32 相同的接口。

4

5 回答 5

8

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

Delimon.Win32.IO 库 (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 个字符)。通常,您会在使用标准 .NET 库时遇到 System.IO.PathTooLongException错误。

于 2013-02-16T05:41:18.927 回答
1

这是 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-03-06T12:57:43.680 回答
1

您必须使用 P/Invoke 和 Win32 API 函数的 Unicode 版本。您将需要FindFirstFile,FindNextFileFindClose功能。

另见:

于 2012-03-06T13:00:21.243 回答
0

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

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

你懂我的意思吗?

于 2012-03-06T12:58:27.370 回答
-1

我还建议阅读 BCL 团队于 2007 年发布的这篇由三部分组成的博客文章,但具体涉及 DirectoryInfo 在深度嵌套文件夹方面的限制。它涵盖了 MAX_PATH 限制的历史、较新的 \?\ 路径格式以及各种基于 .NET 的解决方案和变通方法。

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

于 2012-03-06T13:15:28.393 回答