C++ WinAPI:处理长文件路径/名称

use*_*297 8 c++ winapi max-path long-filenames

我正在寻找在Windows应用程序中处理更长的文件路径.

目前,我有一个文本框(编辑框),用户可以在其中键入绝对文件路径.然后,我将这个类型化的文件路径读GetWindowText入一个声明如下的字符串:TCHAR FilePath[MAX_PATH];

显然,在这里,我依靠的是MAX_PATH常数,这限制了我的260个字符.因此,为了处理更长的文件/路径名称,我可以像这样扩展我的TCHAR数组:TCHAR FilePath[32767];.

或者,还有更好的方法?我可以使用可变长度数组吗?(TCHAR FilePath[];这在C++中是否可能? - 对不起,我对此很新).

先谢谢你!


这是我上面提到的整个代码片段:

TCHAR FilePath[MAX_PATH];
ZeroMemory(&FilePath, sizeof(FilePath));
GetWindowText(hWndFilePath, FilePath, MAX_PATH);
Run Code Online (Sandbox Code Playgroud)

Dea*_*ing 11

Windows上的文件路径存在许多限制.默认情况下,路径不能超过260个字符,这是MAX_PATH常量的用途.

但是,您可以通过在路径前添加"\\?\" 访问更长的路径(具有某些限制).但是,使用"\\?\"前缀的限制通常超过了好处:

  1. 有一些是做这个前缀不支持路径的Win32 API(例如,LoadLibrary总是会失败,它是长度超过260个字符的路径上)
  2. 使用"\\?\"前缀时,Win32规范化规则不会生效.例如,默认情况下,路径中的"/"将转换为"\","." 并且".."分别转换为对当前目录和父目录的引用,依此类推:当您使用"\\?\"前缀时,不会发生这种情况.
  3. 仅仅因为你可以修改你的程序,支持更长的路径,其它程序可能无法打开你所创建的文件.这将是如果这些其他程序不的情况下用"\\?\"前缀.

说实话,第2点是真正的杀手:当你使用"\\?\"前缀时,你会遇到各种各样的麻烦,如果你走这条路,你基本上必须自己重新实现Win32规范化规则.

因此,我的建议是坚持260限制.至少在更长的路径上有更好的平台支持.

  • 对于#2,请注意,[GetFullPathNameW](https://msdn.microsoft.com/library/aa364963) 会为您执行此规范化,并且**不**限于 MAX_PATH,除非您将其指定为缓冲区大小。(仅*在*调用 GetFullPathName 后才在路径前添加 \\?\ 前缀。)剩下的一些注意事项: 1) UNC 路径必须使用 \\?\UNC\ 代替 \\。2) DOS 设备(如 NUL 或 somedir\NUL)被转换为 \\.\NUL,但 \\.\ 并不是在任何地方都可以工作(而 \\?\UNC\.\NUL 完全是另外一回事)。3) \\?\C:\NUL 会创建一个难以处理的文件。 (3认同)

Jer*_*fin 5

这取决于你正在编写什么样的程序.我自己的策略通常是将路径创建的长度限制为MAX_PATH,但能够从较长的路径读取现有数据(使用Dean在其答案中提到的"\\?\"前缀).但是有一些例外 - 例如,备份程序应该接受长路径,并且必须准确地再现它作为输入给出的内容.

虽然Dean肯定是正确的,因为Windows没有规范化更长的路径,但我并没有发现这是一个普遍规则的问题.这通常不意味着编写自己的代码来规范化路径 - 它通常意味着让用户以一种简单地不首先生成这样的东西的方式输入路径.