关于 c :GetCurrentDirectory() 只检索磁盘名称
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; |
这是输出:
|
1
|
Z
|
因为我的项目在我的 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
3char path[MAX_PATH + 1] ="";
DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
cout << path;或者这个(推荐):
1
2
3wchar_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
3char path[MAX_PATH + 1] ="";
DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
cout << path;或者这个(推荐):
1
2
3wchar_t path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectoryW(MAX_PATH, path);
wcout << path;
你想要这个(使用 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 或 WinAPIWCHAR 。此外,如果未启用长路径,则MAX_PATH 缓冲区就足够了,因为SetCurrentDirectory 仅限于MAX_PATH - 1 字符,包括所需的尾部斜杠。但是,您仍然应该进行防御性编码,以防进程启用了长路径或出现错误。检查返回值是否大于零且小于MAX_PATH 。 - @ErykSun 谢谢,我纠正了错字。您关于长路径的评论是正确的。