更新:在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 ++控制台
答案 0 :(得分:5)
问题是你正在编译定义了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
代替。我简要介绍了所有这些不同的文件夹,它们的含义以及何时应该在my answer here中使用它们。
请注意,SHGetSpecialFolderPath
功能会将您限制为特殊文件夹的特定子集。这让我想起......
从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及更高版本的新应用程序。