visual如何在C++中找到桌面路径
visual How to find Path of Desktop in 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<<"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];
但这并不是唯一的问题。还有几件事需要注意:
在编写Win32代码时,应该强烈考虑使用
TRUE
和FALSE
符号,而不是文字0
和1
。当函数的文档表明它接受BOOL
类型的值时,请利用已经为该类型定义的符号。它使您的代码更加清晰易读,即使您可以合理地假设这些符号永远不会改变它们在标题中的定义。如果您想要桌面文件夹,
CSIDL_LOCAL_APPDATA
不是正确的常量。这将返回一个与当前用户关联的文件夹,该文件夹旨在由应用程序用于存储不应与用户一起漫游的数据(该文件夹应存储在本地计算机上,并且仅可在上使用)。综合考虑,无论如何,这可能是一个比桌面更好的选择,因为应用程序在将垃圾撒到用户桌面上之前应该有一个非常好的理由。如果需要数据与应用程序一起漫游,则应使用
CSIDL_APPDATA
。我在这里简要介绍了所有这些不同的文件夹是什么,它们的含义,以及你应该在什么时候使用它们。但是,请注意,
SHGetSpecialFolderPath
函数将您限制为特殊文件夹的特定子集。这让我想到…从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);
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 从函数角度看ID到文件路径的内部与外部映射
- boost xml parsingl将xml的路径作为变量发送
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何使用cppcheck处理半相对包含路径
- 在C++中设置基于操作系统的文件路径
- 基于编译器选项的编译二进制路径
- 按边长度递归搜索图中所有可行路径
- 使用变量值作为 PlaySound 中的路径
- 如何在桌面C++上使用 WinApi 画线
- 如何从服务获取用户桌面的路径
- 如何获取哪些快捷方式和文件在桌面等文件夹路径中突出显示
- 获取当前桌面壁纸的路径
- fstream指向一个特定的路径(到桌面ex.)
- visual如何在C++中找到桌面路径
- 如何在Windows环境下获取主叫用户桌面的绝对路径
- C++-如何获取特定用户的桌面路径