GetTempPathA 我怎么会提前知道大小?

GetTempPathA how would I know size in advance?

我正在使用 Windows API.

用 C 编写代码

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

DWORD GetTempPathA(
  DWORD nBufferLength,
  LPSTR lpBuffer
);

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

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

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

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

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

In the Windows API (with some exceptions discussed in the following paragraphs), the maximum length for a path is MAX_PATH, which is defined as 260 characters.

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

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

您可以使用 固定大小 缓冲区来保存最大可能的路径长度(例如 char buffer[MAX_PATH+1];),或者,如果您想分配 刚好缓冲区space,最初调用GetTempPathA函数,参数nBufferLength为零,参数NULLlpBuffer。 (据我所知,后者没有完整记录,但下面的代码有效,并且该系统用于许多其他需要给定大小缓冲区的 WinAPI 调用。)

测试代码:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    DWORD answer = GetTempPathA(0, NULL);
    printf("%lu\n", 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 终止符的空间)。

来自documentation

Return Value

If the function succeeds, the return value is the length, in TCHARs, of the string copied to lpBuffer, not including the terminating null character. If the return value is greater than nBufferLength, the return value is the length, in TCHARs, of the buffer required to hold the path.

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

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    DWORD answer = GetTempPath(0, NULL);
    _tprintf(TEXT("%lu\n"), 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;
}