繁体   English   中英

如何在 Windows 上找到用户的桌面地址?

[英]How to find get the Desktop address for a user on Windows?

我试图编写一个 C 代码来在桌面上创建一个文件。 我使用 getenv() 来获取地址的用户名,但它打印了一些奇怪的符号。

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

int main(){
    char raw[] = "C://Users/%/Desktop/xyz.txt";
    char loc[strlen(raw)+strlen(getenv("USERNAME"))-1] = "";
    char *env = ""; 
    strcpy(env ,getenv("USERNAME"));

    for (int i = -1; i < sizeof(raw); ++i){
        if (raw[i]!='%'){
            strcpy(loc, raw[i]);
        }
        else if (raw[i]=='%'){
            strcpy(loc, env);
        }
    }

    printf(loc);
    return 0;
}

这是我写的代码(请原谅变量名)。 这就是我得到的: Évs♦↨║╨↕@

我正在使用 GCC。

PS我是该语言的新手,如果这是一个愚蠢的问题,我很抱歉。

编辑 - 我忘了提到我想获得一个带有地址的变量,所以我可以将它用于其他事情。

如有疑问,请查看 Qt 源以了解此类情况。 至少这就是我在寻找这类东西时所做的。

你可以在这里找到他们的做法。 请注意,它是用 C++ 编写的,但操作系统细节通常归结为简单的 C,因为那是低级 API,尽管操作系统提供了一些一切正常)。

基本上,他们使用 GUID shGetKnownFolderPath从 Shell32.dll 调用FOLDERID_Desktop

请注意,从某种意义上说,您正在做的事情很好,但是依赖环境变量有些危险,而且它们不能满足您可能想要获得的很多东西。

在:

    strcpy(env ,getenv("USERNAME"));

指针env是未初始化的。 它需要引用专门分配的 memory, strcpy()可以将字符串复制到其中。

除此之外,您无论如何都使解决方案过于复杂。 考虑:

#include <stdio.h>
#include <windows.h>

int main()
{
    char loc[MAX_PATH + 1] ;
    sprintf( loc, "C:\\Users\\%s\\Desktop\\xyz.txt",  getenv("USERNAME") ) ;
    printf( "%s\n", loc);

    return 0;
}

然而,这是一个有缺陷的假设。 例如,我的桌面文件夹位于D:\Users\%USERNAME%\Desktop - 用户可以将他们的特殊文件夹移动到他们希望的任何位置(就像我一样)。 此外,不同版本的 Windows 在任何情况下都将其放置在各种其他默认位置。 例如在 XP C:\Documents and Settings\%USERNAME%上。

您应该询问操作系统它的操作系统特殊文件夹在哪里。 例如使用SHGetFolderPathA()

#include <stdio.h>
#include <windows.h>
#include <Shlobj.h>

int main()
{
    char loc[MAX_PATH + 1] ;
    SHGetFolderPathA( NULL, CSIDL_DESKTOP, NULL, 0, loc) ; 
    printf( "%s\n", loc);

    return 0;
}

这是 windows 特有的。 USERPROFILE环境变量应该获取用户主页的路径,在这种情况下,桌面路径可以如下计算。

char desktop_path[MAX_PATH + 1] ;
sprintf( desktop_path, "%s\\Desktop", getenv("USERPROFILE") ) ;

char filepath[MAX_PATH + 1] ;
sprintf( filepath, "%s\\%s", desktop_path, "whateverfile.txt" ) ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM