在桌面上创建文件 (C++)

Creating a file on desktop (C++)

本文关键字:C++ 文件 创建 桌面      更新时间:2023-10-16

目前我正在使用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......