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

visual How to find Path of Desktop in C++

本文关键字:桌面 路径 C++ visual      更新时间:2023-10-16

更新: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<<"hellon";
    file.close();
    return 0;
}

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

问题是,编译应用程序时定义了UNICODE(这是应该的),这意味着C样式字符串不是存储在char数组中(对于ANSI字符串来说是这样),而是存储在wchar_t数组中。

这就是为什么不能从char*转换为LPWSTR(在Windows标头中,typedef被视为wchar_t*)。

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

wchar_t appData[MAX_PATH];

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

TCHAR appData[MAX_PATH];

但这并不是唯一的问题。还有几件事需要注意:

  1. 在编写Win32代码时,应该强烈考虑使用TRUEFALSE符号,而不是文字01。当函数的文档表明它接受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;
    }
    

    该家族的最新成员是SHGetKnownFolderPath,用于仅针对Windows Vista及更高版本的新应用程序。

    Böyle Olması Gerekiyor
    TCHAR path[_MAX_PATH] = _T("");
    if (SUCCEEDED(SHGetFolderPath(NULL, 
                                  CSIDL_DESKTOP 
                                  0, 
                                  NULL, 
                                  path))) 
    strcat(path,"\Test.txt");
    ofstream out;
    out.open(path);