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

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

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

这是我的function

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(); } 

我不能让目录名更短,因为我不允许这样……我怎么能解决这个问题呢?

补充:这是另一个function:

 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); } } 

EDIT在他使用Zeta Long Paths的地方找到了这个: 我如何使用FileInfo类,避免使用PathTooLongException?

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

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

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

以下是有关前面提到的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的基本文件function,并支持最多32,767个字符的文件和文件夹名称。

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

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

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

例如,你可以把路径C:\ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa到驱动器R:和继续探索C的子文件夹:\ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa通R:…

你懂我的意思吗?

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

另见:

  • C#删除具有长路径的文件夹
  • DirectoryInfo,FileInfo和很长的路径

我也建议你阅读这三部分博客文章从BCL团队,于2007年出版,但具体涉及的DirectoryInfo的限制,当涉及到深层的文件夹。 它涵盖了MAX_PATH限制的历史,较新的\?\路径格式以及各种基于.NET的解决方案和解决方法。

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