如何处理名称超过259个字符的文件?
我正在开发一个应用程序,它遍历某些目录中的每个文件,并对这些文件执行一些操作。其中,我必须检索文件大小和修改此文件的日期。
有些文件全名(目录+文件名)太长,我无法使用.NETFramework
FileInfo
,仅限于MAX_PATH
(260个字符)。许多Web资源建议通过P / Invoke使用本机Win32函数来访问名称太长的文件。
目前,Win32函数似乎出现了完全相同的问题。例如,对于270字节的路径,GetFileAttributesEx
(kernel32.dll)失败,Win32错误3 ERROR_PATH_NOT_FOUND。
可以从Notepad2成功打开同一个文件并使用Windows资源管理器成功显示(但Visual Studio 2010例如由于259个字符限制¹而无法打开它)。
当文件路径长度为270个字符时,如何才能访问文件?
笔记:
删除或忽略文件路径长度超过259个字符的文件不是解决方案。
我正在寻找仅与Unicode兼容的解决方案。
该应用程序将在安装了.NET Framework 4的Windows 2008 / Vista或更高版本下运行。
¹令人惊讶的是,Microsoft Word 2007失败了,在没有任何软盘驱动器的计算机上抱怨“软盘太小”,或者在剩下4 GB RAM时“RAM内存很低”,或者最后那个“防病毒软件[...]需要更新”。他们有一天会停止显示至少在像Microsoft Office这样的关键产品中出现如此愚蠢无意义的错误吗?
没有找到相关结果
已邀请:
8 个回复
晤默报
语法。 .NET核心解决方案 它只是起作用,因为框架为您添加了长路径语法。 Pre .NET 4.6.2解决方案 还可以使用长路径语法和带有P / Invoke的Win32 API函数的Unicode版本。 从命名文件,路径和命名空间: Windows API具有许多函数,这些函数也具有Unicode版本,以允许扩展长度路径,最大总路径长度为32,767个字符。这种类型的路径由用反斜杠分隔的组件组成,每个组件都取决于GetVolumeInformation函数的lpMaximumComponentLength参数中返回的值(此值通常为255个字符)。要指定扩展长度路径,请使用
前缀。例如,
。 阅读此Microsoft支持页面可能也很有趣。 Kim Hamilton在BCL团队博客中对.NET中的Long Paths进行了非常广泛的解释,列出了处理这些路径的一些问题,他声称这是直接在.NET中不支持这种语法的原因: 有几个原因我们过去不愿意添加长路径,以及为什么我们仍然需要谨慎呢?...>。 < ...>
前缀不仅可以实现长路径;它会导致路径传递到文件系统,而Windows API只需进行少量修改即可。结果是
关闭Windows API执行的文件名规范化,包括删除尾随空格,扩展'。'和'..',将相对路径转换为完整路径等等。< ...> < ...>带有
前缀的长路径可用于大多数与文件相关的Windows API,但不能用于所有Windows API。例如,如果文件名长于MAX_PATH,则LoadLibrary< ...>将失败。 < ...>整个Windows API都有类似的例子;存在一些变通方法,但它们是逐案处理的。 另一个因素< ...>是与其他基于Windows的应用程序和Windows shell本身< ...>的兼容性 因为这个问题变得越来越普遍,所以整个微软都在努力解决这个问题。事实上,作为一个及时的Vista插件,你会注意到一些改变,降低了达到MAX_PATH限制的可能性:许多特殊文件夹名称缩短了,更有趣的是,shell使用了自动路径缩小功能< ...>尝试将它们挤压成260个字符。 警告:您可能需要直接调用Windows API,因为我认为.NET Framework可能不支持这种路径语法。
素汞读
同
这将让你处理长文件和文件夹。 来自网站: Delimon.Win32.IO取代了System.IO和。的基本文件功能 支持File&文件夹名称最多为32,767个字符。 此库是在.NET Framework 4.0上编写的,也可以使用 在x86& x64系统。文件&文件夹限制标准 System.IO命名空间可以处理a中包含260个字符的文件 文件名和文件夹名中的240个字符(通常是MAX_PATH 配置为260个字符)。通常你会碰到 标准.NET库出现System.IO.PathTooLongException错误。
佬棠
和
课程来解决这个问题。每当我平时使用
时我就会使用它。 可能有优化等,但它已经很好地工作多年了。
和相应的
:
:
抢垢洛韧
祁澈盘哼颗
澜悍景哭苟
响摔衅幸
慷祈霖黑
然后在循环中确保跳过长路径文件。工作实例:
if(IsPathWithinLimits(name)== false)检测到任何具有长路径的文件。