目前我正在使用Windows 8.1 .... 在C ++中我尝试使用这些代码在桌面上创建文件时...
#include "stdafx.h"
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ofstream myfile("C:/Users/%USERPROFILE%/Desktop/myfile.anything");
//ofstream myfile("C:/users/myfile.anything"); //Works fine with run As Administrator
return 0;
}
所以问题是完全清楚的1.用户配置文件不知道为什么? 2.i应该以管理员身份运行程序,但在here中不需要运行.... 我想知道是否还有一些简单的方式.... 感谢
答案 0 :(得分:1)
正如评论所指出的那样,您尝试在文件路径中使用环境变量,标准的iostream不会进行环境变量扩展。您必须自己使用特定于平台的代码来完成该部分,或者只使用&#34; normal&#34;文件路径。
对于Windows上的C ++,the function to do this is GetEnvironmentVariable。它是采用固定大小缓冲区的那些函数之一,因此使用它非常挑剔there's already a stackoverflow question all about how to call it correctly。
P.S。正如评论所指出的那样,在执行环境变量扩展的地方(例如shell脚本或Windows资源管理器),它实际上是%USERPROFILE%,而不是&amp; USERPROFILE&amp;。
答案 1 :(得分:1)
对另一个问题的评论是正确的。这是解决此问题的基本方法(使用http://msdn.microsoft.com/en-us/library/windows/desktop/ms683188%28v=vs.85%29.aspx)
#include <fstream>
#include <Windows.h>
#include <string>
using namespace std;
int main() {
WCHAR *buffer = new WCHAR[260];
const WCHAR name[12] = "USERPROFILE";
DWORD result = GetEnvironmentVariable(name, buffer, 260);
if (result > 260) {
delete[] buffer; buffer = new WCHAR[result];
GetEnvironmentVariable(name, buffer, result);
}
wstring s("C:/Users/");
s += buffer;
s += "/Desktop/myfile.anything";
ofstream myfile(s.c_str());
// do things here
delete[] buffer;
return 0;
}
答案 2 :(得分:0)
您可以通过多种方式获取用户个人资料目录:
通过环境变量USERPROFILE
:
#include <cstdlib>
...
string profile = getenv("USERPROFILE");
通过Windows API,但有点难:
#include <windows.h>
#include <userenv.h>
...
HANDLE processToken = ::GetCurrentProcess();
HANDLE user;
BOOL cr = ::OpenProcessToken(processToken, TOKEN_ALL_ACCESS, &user);
DWORD size = 2;
char * buff = new char[size];
cr = ::GetUserProfileDirectoryA(user, buff, &size); // find necessary size
delete[] buff;
buff = new char[size];
cr = ::GetUserProfileDirectoryA(user, buff, &size);
string profile = buff;
delete[] buff;
并且您必须与userenv.lib
链接 - 返回代码的测试留作练习: - )
通过ExpandEnvironmentString
:
size = ::ExpandEnvironmentStringsA("%USERPROFILE%\\Desktop\\myfile.anything",
NULL, 2);
buff = new char[size];
size = ::ExpandEnvironmentStringsA("%USERPROFILE%\\Desktop\\myfile.anything",
buff, size);
string profile = buff;
delete[] buff;
使用第三种方式,你可以直接使用你的字符串,第一种和第二种只能得到配置文件目录,但仍然必须将它与相关路径连接起来。
但实际上,如果您希望编程与语言无关,那么您应该使用SHGetSpecialFolderPath
API函数:
#include <shlobj.h>
...
buff = new char[255];
SHGetSpecialFolderPathA(HWND_DESKTOP, buff, CSIDL_DESKTOPDIRECTORY, FALSE);
string desktop = buff;
delete[] buff;
因为在我的旧法语XP框中,Desktop
实际上是Bureau
...