在桌面上创建文件 (C++)
Creating a file on desktop (C++)
目前我正在使用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.我应该以管理员身份运行程序,但在这里不需要运行为....我想知道是否有更简单的方法....谢谢
正如注释所指出的,您正在尝试在文件路径中使用环境变量,而标准 iostream 不执行环境变量扩展。您必须使用特定于平台的代码自己完成这部分,或者只是使用"普通"文件路径。
对于Windows上的C++,执行此操作的函数是GetEnvironmentVariable。它是需要固定大小缓冲区的函数之一,因此使用它足够挑剔,以至于已经存在一个关于如何正确调用它的堆栈溢出问题。
附言正如评论还指出的那样,在执行环境变量扩展的地方(例如shell脚本或Windows资源管理器),它实际上是%USERPROFILE%,而不是&USERPROFILE&。
对另一个问题的评论是正确的。这是解决此问题的基本方法(使用 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;
}
您有很多方法可以获取用户配置文件目录:
-
通过环境变量
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
......
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到