如何处理文件名超过259个字符的文件?

7 浏览
0 Comments

如何处理文件名超过259个字符的文件?

我正在开发一个应用程序,需要遍历一些目录中的每个文件,并对这些文件进行一些操作。其中,我必须获取文件的大小和文件的修改日期。\n一些文件的完整名称(包括目录和文件名)太长,无法使用.NET Framework的FileInfo类,因为其限制为MAX_PATH(260个字符)。许多网络来源建议通过P/Invoke使用本地Win32函数来访问名称过长的文件。\n目前,使用Win32函数似乎也会出现完全相同的问题。例如,GetFileAttributesEx(kernel32.dll)在270字节的路径上失败,返回Win32错误3 ERROR_PATH_NOT_FOUND。\n同样的文件可以成功地在Notepad2中打开并在Windows资源管理器中成功显示(但是例如Visual Studio 2010无法打开它,因为有259个字符的限制¹)。\n当文件路径长达270个字符时,我该怎么办才能访问文件?\n注意:\n

    \n

  • 删除或忽略文件路径长度超过259个字符的文件不是一个解决办法。
  • \n

  • 我只寻找兼容Unicode的解决方案。
  • \n

  • 该应用程序将在安装了.NET Framework 4的Windows 2008/Vista或更高版本下运行。
  • \n

\n


\n¹ 令人惊讶的是,Microsoft Word 2007失败了,抱怨在没有软盘驱动器的计算机上“软盘驱动器太小”,或者在还剩下4GB的RAM内存时“RAM内存不足”,或者最后是“需要更新防病毒软件”。他们什么时候会停止在至少在Microsoft Office等关键产品中显示这种毫无意义的愚蠢错误呢?

0
0 Comments

如何处理文件名超过259个字符的问题?

出现的原因:

标准的.NET库中的System.IO命名空间对于文件名只支持260个字符,而文件夹名只支持240个字符。当文件名超过这个限制时,会抛出System.IO.PathTooLongException异常。

解决方法:

1. 使用Delimon.Win32.IO库:

Delimon库是一个基于.NET Framework 4的库,可以克服长文件名的问题。它有自己版本的System.IO中的关键方法。例如,可以将System.IO.Directory.GetFiles替换为Delimon.Win32.IO.Directory.GetFiles,从而能够处理长文件和文件夹。

2. 使用AlphaFS库:

AlphaFS库可以处理超过260个字符的路径。

Delimon.Win32.IO库和AlphaFS库都提供了更大的文件名和文件夹名的支持,可以解决标准的.NET库中的限制。通过使用这些库,可以处理超过259个字符的文件名的问题。

0
0 Comments

如何处理文件名超过259个字符的问题?

问题的出现原因是:Windows操作系统对文件名的长度有限制,最长为259个字符。当文件名超过这个限制时,就会出现问题,无法正常使用系统的文件操作方法。

解决方法是:创建自己的LongFile和LongDirectory类来解决这个问题,这些类使用的是System.IO.File和System.IO.Directory的方法,并且在处理超长文件名时进行了特殊处理。这些类中的方法包括Exists、Delete、AppendAllText、WriteAllText、WriteAllBytes、Copy、Move、ReadAllText、ReadAllLines、GetDirectories和GetFiles等。

具体的处理方法是,在处理文件名之前,先判断文件名的长度是否超过259个字符。如果没有超过,则直接使用System.IO.File和System.IO.Directory的相应方法进行操作;如果超过,则使用NativeMethods类中的一些Win32 API函数进行操作。

其中,NativeMethods类中的一些Win32 API函数包括CreateFile、CopyFileW、GetFileAttributesW、DeleteFileW、MoveFileW、SetFileTime、GetFileTime、FindFirstFile、FindNextFile、FindClose、RemoveDirectory和CreateDirectory等。

这些方法通过使用DllImport特性和相应的DllImport函数来调用系统的Win32 API函数,实现了对超长文件名的处理。

整个处理过程中,还包括一些辅助方法,如GetWin32LongPath、Combine、GetCleanPath和GetAllPathsFromPath等,用于处理文件名的格式化和路径的合并等操作。

通过使用这些自定义的LongFile和LongDirectory类,可以有效地处理文件名超过259个字符的问题,使得文件操作方法能够正常工作,并且可以处理超长文件名的路径。

0
0 Comments

如何处理文件名超过259个字符的文件?

在.NET 4.6.2之前的版本中,可以使用长路径语法和Unicode版本的Win32 API函数来处理超长文件名。根据Microsoft的支持页面,Windows API有许多函数都有Unicode版本,可以允许最大总路径长度为32,767个字符。要指定扩展的路径长度,需要在路径前面加上"\\?\"前缀。例如:"\\?\D:\very long path"。

然而,之前.NET版本的处理方法存在一些问题。首先,使用"\\?\"前缀会关闭Windows API执行的文件名规范化,包括去除尾随空格,展开'.'和'..',将相对路径转换为完整路径等。其次,并非所有的Windows API都支持带有"\\?\"前缀的长路径。例如,如果文件名超过MAX_PATH,LoadLibrary函数将失败。因此,需要根据具体情况采取特定的解决方案。此外,为了与其他基于Windows的应用程序和Windows shell兼容,需要注意路径长度的限制。

然而,从.NET 4.6.2开始,框架已经添加了对长路径的支持,不再需要使用"\\?\"前缀或P/Invoke Win32 API函数。因此,在新版本的.NET Core中,处理超长文件名的问题已经得到解决。

如果仍然需要在较旧的.NET版本中处理超长文件名,可以考虑使用第三方库ZetaLongPaths来解决。这个库可以在处理长路径时提供更便捷的方法。

总之,处理文件名超过259个字符的文件的方法可以根据使用的.NET版本和具体需求而有所不同。在较新的.NET版本中,可以直接使用长路径语法,而在较旧的版本中,则需要使用长路径语法和Unicode版本的Win32 API函数或第三方库来解决该问题。

0