GetCurrentDirectory() 仅检索磁盘名称 [重复]

Posted

技术标签:

【中文标题】GetCurrentDirectory() 仅检索磁盘名称 [重复]【英文标题】:GetCurrentDirectory() only retrieve disk name [duplicate] 【发布时间】:2020-09-08 09:43:20 【问题描述】:

我一直在做一些 C++ 编程,但偶然发现了一个奇怪的行为, 每当我尝试使用 GetCurrentDirectory() 获取当前目录时,它只会返回当前磁盘的字母。

代码如下:

TCHAR path[MAX_PATH + 1] = L"";
DWORD len = GetCurrentDirectory(MAX_PATH, path);

cout << (char *)path;

这是输出:

Z

因为我的项目在我的 Z:\ 磁盘中

我想知道它是否与缓冲区大小有关,但我将其设置为 MAX_PATH,甚至尝试将其设置为 1024。

【问题讨论】:

预期输出是什么?你在哪个目录运行你的程序? 我尝试将它放在桌面上的 C:\ 目录中,但它也只检索到 C 字母,因此需要完整路径,如 C:\Users\XXX\Desktop 你在 UNICODE 模式下编译你的程序。使用wcout 而不是cout。并且不要使用TCHAR 类型,而是使用w_char。实际上(char *) 演员是这里的罪魁祸首。 TCHAR 类型仅在您想将代码编译为 UNICODE 字符集程序或多字节字符集程序时才有用,后者现在已经过时了。 如果您只是使用复制和粘贴将纯文本包含到问题中,您的输出会更好地阅读。您的屏幕截图似乎截断了部分文本并与另一个窗口中的文本混合在一起。 @Jabberwocky 我试过了,它也只检索磁盘的字母 【参考方案1】:

cout &lt;&lt; (char *)path 中的 (char *) 强制转换使编译器认为 path 指向 char,但它实际上指向 wchar_t

你想要这个(使用 GetCurrentDirectory 的多字节字符版本(因此 GetCurrentDirectory 中的 A):

char path[MAX_PATH + 1] = "";
DWORD len = GetCurrentDirectoryA(MAX_PATH, path);
cout << path;

或者这个(推荐):

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 谢谢,我纠正了错字。您关于长路径的评论是正确的。

以上是关于GetCurrentDirectory() 仅检索磁盘名称 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Directory.GetCurrentDirectory和Application.StartupPath的区别

(64)C#里使用GetCurrentDirectory()Exists()CreateDirectory() Environment.CurrentDirectory

(64)C#里使用GetCurrentDirectory()Exists()CreateDirectory() Environment.CurrentDirectory

Windows API一日一练 52 GetCurrentDirectory和SetCurrentDirectory函数

System.IO.Directory.GetCurrentDirectory与System.Windows.Forms.Application.StartupPath的用法

win32 关于#include“stdafx.h”详解(明白了预编译头文件)还有GetCurrentDirectory()介绍