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

时间:2010-07-18 23:55:03

标签: c++ winapi long-filenames max-path

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

3 个答案:

答案 0 :(得分:11)

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

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

  1. 有许多Win32 API没有使用此前缀的支持路径(例如,LoadLibrary将始终在超过260个字符的路径上失败)
  2. 使用“\\?\”前缀时,Win32规范化规则不会生效。例如,默认情况下,路径中的“/”将转换为“\”,“。”并且“..”分别转换为对当前目录和父目录的引用,依此类推:当您使用“\\?\”前缀时,不会发生这种情况。
  3. 仅仅因为您可以修改您的程序以支持更长的路径,其他程序可能无法打开您创建的文件。如果其他程序使用“\\?\”前缀,则会出现这种情况。
  4. 老实说,第2点是真正的杀手:使用“\\?\”前缀时,你会遇到各种各样的麻烦,如果你去的话,基本上你必须自己重新实现Win32规范化规则那条路。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:-4)

不,因为如果你有更长的路径,Windows就无法接受它。因此,从技术上讲,你可以拥有比缓冲区更多的字符,你实际上永远不会使用文件路径结果。