C++WinAPI:处理长文件路径/名称
-
17-09-2020 - |
题
我正在考虑在我的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);
解决方案
Windows上的文件路径有许多限制。默认情况下,路径不能超过260个字符,这就是 MAX_PATH
常数是为了。
但是,你 可以 通过在路径前加上"\\?\".但是,使用"\\?前缀通常大于好处:
- 有许多Win32Api不支持此前缀的路径(例如,
LoadLibrary
在长度超过260个字符的路径上总是会失败) - Win32规范化规则在使用"\\?\"前缀。例如,默认情况下,paths中的"/"转换为"\","。"和"。."分别转换为对当前目录和父目录的引用等等:当你使用"\\?\"前缀。
- 只是因为你可以修改 你的 程序为了支持更长的路径,其他程序可能无法打开您创建的文件。如果其他程序不这样做,情况就会如此 也 使用"\\?\"前缀。
说实话,第2点才是真正的杀手:当你使用"\\"时,你会遇到各种各样的麻烦。\"前缀,你基本上要重新实现Win32规范规则自己,如果你走那条路线。
因此,我的建议是坚持260限制。至少在有更好的平台支持更长的路径之前。
其他提示
这取决于你正在写什么样的程序。我自己的策略通常是限制路径 创造 到MAX_PATH的长度,但能够读取 现有 来自较长路径的数据(使用"\\?\"dean在他的回答中提到)。但也有例外--举个例子,备份程序应该接受长路径,并且必须准确地复制它作为输入给出的内容。
虽然Dean肯定是正确的,Windows不会为您规范化更长的路径,但我有 不是 发现这是一个普遍的关注。这通常并不意味着编写自己的代码来规范路径-它通常意味着让用户以一种根本不会生成此类内容的方式输入路径。
不,因为如果您获得更长的路径,Windows无法接受它。因此,虽然从技术上讲,您可以在缓冲区中保存比该字符更多的字符,但您永远无法实际使用filepath结果。