【问题标题】:Default write file to desktop默认将文件写入桌面
【发布时间】:2014-04-27 09:05:21
【问题描述】:

c++中是否有默认代码将文件(.txt)写入桌面,可以在不知道前导/desktop的情况下用于任何计算机?

【问题讨论】:

  • “领先的/桌面”是什么意思?

标签: c++ qt file visual-studio-2012 qstandardpaths


【解决方案1】:

最便携的方式是使用Qt,即QStandardPaths

标准库对它没有任何临时支持,因此您要么需要重新发明轮子,要么找到一个已经存在的强大解决方案。 Qt就是这样的东西。

QStandardPaths::DesktopLocation 0 返回用户的桌面目录。

在这种情况下,您可以使用QFile 以及 ofstream 将文件写入该文件夹。为此,您只需要依赖 QtCore

代码如下所示:

#include <QFile>
#include <QStandardPaths>
#include <QDebug>
#include <QTextStream>

...

QFile file(QStandardPaths::locate(QStandardPaths::DesktopLocation, ""));
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    qDebug() << "Failed to open";

QTextStream out(&file);

// Done, yay!

这将在 QtCore 支持的发行版和操作系统中平稳运行,包括但限于:

  • Windows

  • Linux

  • Mac

  • QNX

等等。

【讨论】:

    【解决方案2】:

    SHGetKnownFolderPath 与FOLDERID_Desktop(Vista 及更高版本)一起使用,或者将SHGetFolderPathCSIDL_DESKTOP 一起使用,以获得代表当前用户桌面的文件夹。取决于您的 Windows 版本目标,有几个功能,其中一些已弃用。

    【讨论】:

      【解决方案3】:

      只需使用标准标头fstreamgetenv

      #include <iostream>
      #include <fstream>
      #include <cstdlib>
      #include <sstream>
      using namespace std;
      
      int main (int argc, char **argv) 
      {
        if(argc != 2)
        {
          cerr << "usage: " << argv[0] << " filename" << endl;
          return 1;
        }
      
        std::ostringstream oss;
      
      #ifdef _WIN32
      
        oss << getenv("HOMEDRIVE") << getenev("HOMEPATH");
      
      #else
      
        oss << getenv("HOME");
      
      #endif
      
        oss << "/" << argv[1];
      
        ofstream f;
        f.open (oss.str().c_str());
        f << "bar";
        f.close();
        return 0;
      }
      

      【讨论】:

      • 我认为无论什么操作系统,他都希望文件位于桌面上。所以不仅仅是 C:\Users\user\Desktop 他还希望它出现在 /home/user/Desktop/
      • @David 有什么特别的理由认为 /home/user/Desktop/ 确实存在于所有操作系统中吗?我认为这就是 Gnome 默认调用的,但如果需要,您可以更改它。
      • Windows 没有 /home/user/Desktop。
      • @AntiClimacus 对于 Windows,您应该使用 windows api 函数 - 请参阅 SHGetFolderPath 或 SHGetKnownFolderPath
      • 请使用现有的跨平台解决方案,而不是重新发明它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多