C#如何解决使用DirectoryInfo时的限制

本文关键字:DirectoryInfo 何解决 解决 | 更新日期: 2023-09-27 18:26:46

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

指定的路径、文件名或两者都太长。完全限定的文件名必须少于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?

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

编辑昨天使用了齐塔人之路,效果很好!它甚至浏览了需要权限访问的文件夹。

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

C#如何解决使用DirectoryInfo时的限制

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

Delimon.Win32.I​O库(V4.0).

它有自己版本的System.IO中的键方法。例如,您可以替换:

System.IO.Directory.GetFiles 

带有

Delimon.Win32.IO.Directory.GetFiles

这将允许您处理长文件和文件夹。

来自网站:

Delimon.Win32.IO替换了System.IO和支持文件&文件夹名称最多可包含32767个字符。

此库是在.NET Framework 4.0上编写的,可以使用在x86&x64系统。文件&标准的文件夹限制System.IO命名空间可以处理在文件名和文件夹名中的240个字符(MAX_PATH通常为配置为260个字符)。通常你会遇到System.IO.PathTooLongException标准.NET库错误。

这是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

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

另请参阅:

  • C#删除路径较长的文件夹
  • DirectoryInfo、FileInfo和超长路径

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

例如,您可以将路径c:''aaaaaaaaaa转换为驱动器R:,并通过R:继续浏览c:''aaaaaa的子文件夹。。。

你知道我的意思吗?

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

全面,尽管可能有点过时。