如何在Windows中获取当前用户的主目录

8

如何获取当前用户的主目录路径?

例如: 在Windows中,如果当前用户是“guest”,我需要“C:\Users\guest”

我的应用程序将在大多数Windows版本(XP,Vista,Win 7)上运行。


1
你是在寻找当前路径还是主目录?如果你希望别人付出努力来帮助你,请认真提问并正确拼写和措辞。 - Adam Liss
抱歉,我需要获取用户路径。在Windows 7中,每个已登录的用户都有一个位于“users”文件夹下的帐户。如果我的登录帐户是HPFE,则需要获取路径“C:\ users \ hpfe”。 - Ullan
4个回答

16

使用函数SHGetFolderPath。与查询环境变量相比,此函数更受欢迎,因为后者可能会被修改以指向错误的位置。文档中包含一个示例,在此稍作调整并重复:

#include <Shlobj.h>  // need to include definitions of constants

// .....

WCHAR path[MAX_PATH];
if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, path))) {
  ...
}

甜,我不知道这个。 - scibuff
你的意思是,用户位置可以配置为任何位置? - Ullan
感谢您提供更好的解决方案。 - Ullan
4
"SHGetFolderPath"已经被弃用,而它的继承者"SHGetKnownFolderPath"在Windows XP上不可用。 - following
对于任何使用QT的人,如果想要从中获取字符串,请使用以下代码> QString :: fromWCharArray(path) - Dariusz
显示剩余2条评论

5
我已经使用了%USERPROFILE%来获取当前用户的主目录路径。

4

1
有没有可能,系统驱动器可以是“C:”,而HomePath可以是E:\Users{username}? - Ullan
可能会需要参考此文链接 http://lifehacker.com/5467758/move-the-users-directory-in-windows-7 ,但这只是一个“符号链接”,因此C:\Users将指向E:\Users,所以路径仍然会被解析。 - scibuff
1
这可能是针对Windows 7的情况,但我相信至少在Windows XP下,您实际上可以将配置文件目录移动到另一个卷中,因此您永远不应该使用SystemDrive环境变量。请使用SHGetFolderPathW,它始终正确,在所有支持的Windows版本上都可以工作,并且更易于使用。 - Philipp
6
你应该使用 %HOMEDRIVE% 而不是 %SystemDrive% 来配合 %HomePath% - gregmac

-2

方法一:

#include <Shlobj.h>

std::string desktop_directory(bool path_w)
{
    if (path_w == true)
    {
        WCHAR path[MAX_PATH + 1];
        if (SHGetSpecialFolderPathW(HWND_DESKTOP, path, CSIDL_DESKTOPDIRECTORY, FALSE))
        {
            std::wstring ws(path);
            std::string str(ws.begin(), ws.end());
            return str;
        }
        else return NULL;
    }
}

方法二:

#include <Shlobj.h>

LPSTR desktop_directory()
{
    static char path[MAX_PATH + 1];
    if (SHGetSpecialFolderPathA(HWND_DESKTOP, path, CSIDL_DESKTOPDIRECTORY, FALSE)) return path;
    else return NULL;
}

你能简要解释一下它们之间的区别吗? - G_V
你的代码返回的是桌面目录,而不是所要求的主目录。请将 CSIDL_DESKTOPDIRECTORY 替换为 CSIDL_PROFILE(并适当地重命名函数),以便返回用户的主目录,如所要求的那样。 - Michael Krebs
此外,方法2返回指向静态内存的指针,如果在多个用户共享的进程中使用,将会出现问题。如果两次调用方法2返回不同的值,则第一个返回值将“神奇”更改,因为第二次调用将重用与第一次调用相同的内存空间作为其返回值。请谨慎考虑后再生产中使用方法2。 - Michael Krebs
1
此外,方法1并不会在所有代码路径上返回一个值(例如,如果path_w为false)。 - Michael Krebs
另外,SHGetSpecialFolderPathW已不再受支持,目前已被SHGetKnownFolderPath取代。 - Michael Krebs
返回 NULL 而不是 std::string 可能是一个非常糟糕的想法。你可以使用 nullptr 代替 NULL - Adrian Maire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接