如何在C++中找到桌面路径

Jus*_*n k 2 c++ visual-c++

更新:在Cody Gray的回复之后

我想找到一种方法将文件保存到桌面.由于每个用户都有不同的用户名,我发现以下代码将帮助我找到其他人桌面的路径.但是如何将以下内容保存到桌面?

#include <iostream>
#include <windows.h>
#include <fstream>
#include <direct.h>
#include <shlobj.h>
using namespace std;
int main ()
{
    ofstream file;  

    TCHAR appData[MAX_PATH];
    if (SUCCEEDED(SHGetFolderPath(NULL,
                                  CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE,
                                  NULL,
                                  SHGFP_TYPE_CURRENT,
                                  appData)))

    wcout << appData << endl; //This will printout the desktop path correctly, but
    file.open(appData +"/.txt"); //how can I open the desktop path here??
    file<<"hello\n";
    file.close();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Microsoft Visual Studio 2010,Windows 7,C++控制台

Cod*_*ray 5

问题是您正在使用已UNICODE定义的(正如您应该)编译应用程序,这意味着C样式的字符串不存储在char数组中(因为它们将用于ANSI字符串),而是存储wchar_t数组.

这就是你无法转换char*LPWSTR(typedef在Windows标题中编辑为wchar_t*)的原因.

解决方案是更改字符串缓冲区的类型.您可以wchar_t明确使用:

wchar_t appData[MAX_PATH];
Run Code Online (Sandbox Code Playgroud)

或者利用TCHAR将自动#define转换为适当类型的宏,具体取决于您是否使用已UNICODE定义的编译:

TCHAR appData[MAX_PATH];
Run Code Online (Sandbox Code Playgroud)

这不是唯一的问题.还有几点需要注意:

  1. 你应当认真考虑使用TRUEFALSE符号来代替文字的01写的Win32代码时.当函数的文档指示它接受类型的值时BOOL,请利用已为该类型定义的符号.它使您的代码更清晰,更易于阅读,即使您可以合理地假设这些符号永远不会更改其在标题中的定义.

  2. CSIDL_LOCAL_APPDATA如果您想要桌面文件夹,则不是正确的常量.这将返回与当前用户相关联,并旨在通过应用用于存储数据应该使用的文件夹没有与用户漫游(应贮存和可用的本地机器上).考虑到所有事情,这可能是比桌面更好的选择,因为应用程序在将垃圾泄漏到用户桌面之前应该有一个很好的理由.

    如果您需要使用应用程序漫游数据,则应使用CSIDL_APPDATA.我简要介绍了所有这些不同文件夹的含义,它们的含义以及何时应该在我的答案中使用它们.

    但请注意,该SHGetSpecialFolderPath功能将您限制为特殊文件夹的特定子集.这让我想到......

  3. 从Windows 2000开始(我老实说,我认为还没有人 2000年之前编写针对Windows版本的应用程序),这个SHGetSpecialFolderPath功能已经过时了.

    对于那些以Windows 2000和XP为目标的首选替代品SHGetFolderPath,您将以类似的方式使用它们:

    TCHAR appData[MAX_PATH];
    
    if (SUCCEEDED(SHGetFolderPath(NULL, 
                                  CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, 
                                  NULL, 
                                  SHGFP_TYPE_CURRENT, 
                                  appData))) 
    {
        wcout << appData << endl;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    该系列的最新成员SHGetKnownFolderPath适用于仅针对Windows Vista及更高版本的新应用程序.