GetCurrentDirectory() only retrieve disk name
我一直在做一些 C 编程,但偶然发现了一个奇怪的行为,
每当我尝试使用 GetCurrentDirectory() 获取当前目录时,它只会返回当前磁盘的字母。
这是代码:
1 2 3 4
| TCHAR path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectory(MAX_PATH, path);
cout << (char *)path; |
这是输出:
因为我的项目在我的 Z:\\\\ 磁盘中
我想知道它是否与缓冲区大小有关,但我将其设置为 MAX_PATH,甚至尝试将其设置为 1024。
- 什么是预期的输出?你在哪个目录运行你的程序?
-
我试图把它放在桌面上的 C:\\\\\\\\ 目录中,它也只检索到 C 字母,所以完整路径应该像 C:\\\\\\\\Users\\\\\\\\XXX\\\\\\\\Desktop
-
你在 UNICODE 模式下编译你的程序。使用 wcout 而不是 cout。并且不要使用 TCHAR 类型,而是使用 w_char 。实际上 (char *) 演员是这里的罪魁祸首。 TCHAR 类型仅在您要将代码编译为 UNICODE 字符集程序或多字节字符集程序时才有用,后者现在已过时。
-
如果您只使用副本,您的输出会更好地阅读
-
cout << (char *)path 中的 (char *) 类型转换使编译器认为 path 指向一个 char,但它实际上指向一个 wchar_t。
你想要这个(使用 GetCurrentDirectory 的多字节字符版本(因此 GetCurrentDirectory 中的 A):
1 2 3
| char path[MAX_PATH + 1] ="";
DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
cout << path; |
或者这个(推荐):
1 2 3
| wchar_t path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectoryW(MAX_PATH, path);
wcout << path; |
-
cout << (char *)path 中的 (char *) 类型转换使编译器认为 path 指向一个 char,但它实际上指向一个 wchar_t。
你想要这个(使用 GetCurrentDirectory 的多字节字符版本(因此 GetCurrentDirectory 中的 A):
1 2 3
| char path[MAX_PATH + 1] ="";
DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
cout << path; |
或者这个(推荐):
1 2 3
| wchar_t path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectoryW(MAX_PATH, path);
wcout << path; |
cout << (char *)path 中的 (char *) 类型转换使编译器认为 path 指向一个 char,但它实际上指向一个 wchar_t。
你想要这个(使用 GetCurrentDirectory 的多字节字符版本(因此 GetCurrentDirectory 中的 A):
1 2 3
| char path[MAX_PATH + 1] ="";
DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
cout << path; |
或者这个(推荐):
1 2 3
| wchar_t path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectoryW(MAX_PATH, path);
wcout << path; |
- 谢谢它的工作,不知道有一个多字节版本
-
@Quentin_otd 只是忘记了 TCHAR 和其他 _tstrlen、_T("foo") 等。它们仅存在,因此您可以将代码编译为 UNICODE 或多字节程序。
-
w_char 应该是 wchar_t 或 WinAPI WCHAR。此外,如果未启用长路径,则 MAX_PATH 缓冲区就足够了,因为 SetCurrentDirectory 仅限于 MAX_PATH - 1 字符,包括所需的尾部斜杠。但是,您仍然应该进行防御性编码,以防进程启用了长路径或出现错误。检查返回值是否大于零且小于 MAX_PATH。
-
@ErykSun 谢谢,我纠正了错字。您关于长路径的评论是正确的。