9

我正在考虑在我的 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);
4

3 回答 3

12

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

但是,您可以通过在路径前加上“\\?\”前缀来访问更长的路径——有一定的限制。但是,使用“\\?\”前缀的限制通常超过了好处:

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

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

因此,我的建议是坚持 260 限制。至少在为更长的路径提供更好的平台支持之前。

于 2010-07-19T00:16:39.117 回答
6

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

虽然 Dean 认为 Windows 不会为您规范更长的路径当然是正确的,但我发现这通常不是一个值得关注的问题。这通常也不意味着编写您自己的代码来规范化路径 - 它通常意味着让用户以一种根本不会首先生成此类内容的方式输入路径。

于 2010-07-19T15:30:30.640 回答
-4

不,因为如果您获得更长的路径,Windows 将无法接受。因此,虽然从技术上讲,您可以在缓冲区中保存更多的字符,但您永远无法真正使用文件路径结果。

于 2010-07-19T00:03:09.087 回答