我正在考虑在我的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 常数是为了。

但是,你 可以 通过在路径前加上"\\?\".但是,使用"\\?前缀通常大于好处:

  1. 有许多Win32Api不支持此前缀的路径(例如, LoadLibrary 在长度超过260个字符的路径上总是会失败)
  2. Win32规范化规则在使用"\\?\"前缀。例如,默认情况下,paths中的"/"转换为"\","。"和"。."分别转换为对当前目录和父目录的引用等等:当你使用"\\?\"前缀。
  3. 只是因为你可以修改 你的 程序为了支持更长的路径,其他程序可能无法打开您创建的文件。如果其他程序不这样做,情况就会如此 使用"\\?\"前缀。

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

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

其他提示

这取决于你正在写什么样的程序。我自己的策略通常是限制路径 创造 到MAX_PATH的长度,但能够读取 现有 来自较长路径的数据(使用"\\?\"dean在他的回答中提到)。但也有例外--举个例子,备份程序应该接受长路径,并且必须准确地复制它作为输入给出的内容。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top