c-GetTempPathA我怎么能提前知道尺寸



我正在使用Windows API使用C进行编码。

我在这里查看了GetTempPathA()函数,并在下面包含了该函数的语法。

DWORD GetTempPathA(
DWORD nBufferLength,
LPSTR lpBuffer
);

我可以看到路径将存储在lpBuffer中,但我不明白如何知道将DWORD nBufferLength设置为多大-我希望有更多Windows开发经验的人会告诉我,这是ANSI语言系统的一个值,也是Unicode的另一个值。但我更愿意向Stackoverflow的专业人士寻求指导?

我认为它需要设置为文件路径的最长值,因为用户可能以某种方式将默认位置更改为系统其他位置的较长路径,但我只是猜测。

这似乎只是一个ANSI函数,但在我浏览MSDN上的文档时,我经常发现函数具有ANSI和Unicode函数(分别以A和W结尾)。我确实理解它们之间的区别,但如果我必须创建一个缓冲区,最大输入大小是多少?

最后,在回答时请记住,我确实喜欢编写向后兼容的应用程序,因为我的许多朋友生活在第三世界国家,无法使用最新的Windows操作系统。

您可以使用一个固定大小的缓冲区,该缓冲区将容纳最大可能的路径长度(例如char buffer[MAX_PATH+1];),或者,如果您想分配足够的缓冲空间,则首先调用GetTempPathA函数,nBufferLength参数为零,lpBuffer值为NULL。(据我所见,后者没有完全记录在案,但下面的代码是有效的,该系统用于许多其他需要给定大小缓冲区的WinAPI调用。)

测试代码:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
DWORD answer = GetTempPathA(0, NULL);
printf("%lun", answer);
char* buffer = malloc(answer);
answer = GetTempPathA(answer, buffer);
printf("Temp path is: >>>%s<<< (length = %lu)n", buffer, answer);
free(buffer);
return 0;
}

注意,第一次调用中answer的值将比第二次调用中的值大一(因为前者将包括用于nul终结器的空间)。

来自文件:

返回值

如果函数成功,则返回值是复制到lpBuffer的字符串的长度(以TCHARs为单位),不包括终止的null字符。如果返回值大于nBufferLength,返回值是保存路径所需的缓冲区。

或者,对于"通用"的版本,对于Unicode和多字节(ANSI)构建,使用以下内容:

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
DWORD answer = GetTempPath(0, NULL);
_tprintf(TEXT("%lun"), answer);
TCHAR* buffer = malloc(sizeof(TCHAR) * answer);
answer = GetTempPath(answer, buffer);
_tprintf(TEXT("Temp path is: >>>%s<<< (length = %lu)n"), buffer, answer);
free(buffer);
return 0;
}

MSDN明确指出,通常最大路径长度为260个字符:

在Windows API中(以下讨论了一些例外情况段落),路径的最大长度为MAX_path,即定义为260个字符。

https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd

文章还指出,应用程序可以通过清单选择进入长路径,从某些Windows版本开始。

相关内容

最新更新