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

时间:2012-02-16 07:08:47

标签: 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;
}

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

1 个答案:

答案 0 :(得分:5)

问题是你正在编译定义了UNICODE的应用程序(你应该这样),这意味着C风格的字符串不存储在char数组中(就像它们一样) ANSI字符串),而是wchar_t数组。

这就是为什么您无法从char*转换为LPWSTR(Windows标头中typedefwchar_t*的原因。

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

wchar_t appData[MAX_PATH];

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

TCHAR appData[MAX_PATH];

但这不是唯一的问题。还有其他几点需要注意:

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

  2. 如果您需要 desktop 文件夹,则
  3. CSIDL_LOCAL_APPDATA不是正确的常量。这将返回一个与当前用户关联的文件夹,供应用程序使用,用于存储应该与用户一起漫游的数据(应该存储并在本地计算机上可用)。考虑到所有这些,这可能是比桌面更好的选择,因为应用程序在将垃圾泄漏到用户桌面之前应该有一个很好的理由。

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

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

  4. 从Windows 2000开始(我真的不认为任何人还在编写针对Windows 之前的版本到2000的应用程序),{ {3}}已过时。

    目标Windows 2000和XP的首选替代品是SHGetSpecialFolderPath function,您可以以类似的方式使用它们:

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

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