更新:在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++控制台
问题是您正在使用已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)
这不是唯一的问题.还有几点需要注意:
你应当认真考虑使用TRUE和FALSE符号来代替文字的0和1写的Win32代码时.当函数的文档指示它接受类型的值时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;
}
Run Code Online (Sandbox Code Playgroud)
该系列的最新成员SHGetKnownFolderPath适用于仅针对Windows Vista及更高版本的新应用程序.