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相同的接口。
这里有关于前面提到的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和支持文件&文件夹名称最多可包含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版本。您将需要FindFirstFile
、FindNextFile
和FindClose
函数。
另请参阅:
- C#删除路径较长的文件夹
- DirectoryInfo、FileInfo和超长路径
您可以使用subst命令。它创建一个虚拟驱动器,从您作为参数传递的任何文件夹开始。
例如,您可以将路径c:''aaaaaaaaaa转换为驱动器R:,并通过R:继续浏览c:''aaaaaa的子文件夹。。。
你知道我的意思吗?
我还建议阅读BCL团队于2007年发布的这篇由三部分组成的博客文章,但特别涉及到DirectoryInfo在深度嵌套文件夹方面的局限性。它涵盖了MAX_PATH限制的历史,即较新的''?''路径格式以及各种基于.NET的解决方案和解决方案。
全面,尽管可能有点过时。