【问题标题】:Get current working directory in a Qt application获取 Qt 应用程序中的当前工作目录
【发布时间】:2011-11-16 04:25:45
【问题描述】:

我正在使用 Qt 库用 C++ 编写程序。我的主 bin 目录中有一个指向可执行文件的符号链接。我希望我的程序的当前工作目录是我使用终端的目录(即pwd 命令的结果)。我看到了QDir::currentPath() 函数,但它返回了二进制文件所在的目录。

如何找到我当前的工作目录?

【问题讨论】:

  • QDir默认构造函数是否给出相同的结果?
  • 是的:QDir dir; Cout << dir.absolutePath() << flush; 给了我可执行文件所在的目录。
  • QDir::currentPath() 和 dir.absolutePath() 都返回命令行的当前目录。

标签: c++ qt


【解决方案1】:

刚刚经过测试,QDir::currentPath() 确实返回了我调用可执行文件的路径。

并且符号链接不“存在”。如果您从该路径执行 exe,则实际上是从符号链接指向的路径执行它。

【讨论】:

    【解决方案2】:

    你试过QCoreApplication::applicationDirPath()

    qDebug() << "App path : " << qApp->applicationDirPath();
    

    【讨论】:

    • 如果我阅读文档,这会给出可执行文件所在的目录。但我想要调用可执行文件的目录。
    • 这通常会起作用,但不是每个人都会使用 QCoreApplication。例如,我的 QTest 不允许我使用它。
    • 使用 applicationDirPath 的问题是在不同的操作系统上返回的路径可能不同,在 Mac 上应用程序被打包在 file.app 文件中,当调用 appliciationDirPath 时,您会得到文件位置和文件夹打包在file.app中
    【解决方案3】:

    我在 Windows 下运行 Qt 5.5,QDir 的默认构造函数似乎选择了当前工作目录,而不是应用程序目录。

    我不确定 getenv PWD 是否可以跨平台工作,我认为它在 shell 启动应用程序时设置为当前工作目录,并且不包括应用程序本身所做的任何工作目录更改(其中可能是 OP 看到这种行为的原因)。

    所以我想我应该添加一些其他方式来为您提供当前工作目录(而不是应用程序的二进制位置):

    // using where a relative filename will end up
    QFileInfo fi("temp");
    cout << fi.absolutePath() << endl;
    
    // explicitly using the relative name of the current working directory
    QDir dir(".");
    cout << dir.absolutePath() << endl;
    

    【讨论】:

    • 谢谢你,马克,但我已经在 linux 下使用 Qt5.3.2 测试了你的两个解决方案,并且都给出了二进制位置...
    • Qt 5.8 on Windows 在这两种情况下都提供了工作目录。
    【解决方案4】:

    要添加到 KaZ 答案, 每当我制作 QML 应用程序时,我倾向于将其添加到主 c++ 中

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QStandardPaths>
    
    int main(int argc, char *argv[])
    {
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    
    // get the applications dir path and expose it to QML 
    
    QUrl appPath(QString("%1").arg(app.applicationDirPath()));
    engine.rootContext()->setContextProperty("appPath", appPath);
    
    
    // Get the QStandardPaths home location and expose it to QML 
    QUrl userPath;
       const QStringList usersLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
       if (usersLocation.isEmpty())
           userPath = appPath.resolved(QUrl("/home/"));
       else
          userPath = QString("%1").arg(usersLocation.first());
       engine.rootContext()->setContextProperty("userPath", userPath);
    
       QUrl imagePath;
          const QStringList picturesLocation = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
          if (picturesLocation.isEmpty())
              imagePath = appPath.resolved(QUrl("images"));
          else
              imagePath = QString("%1").arg(picturesLocation.first());
          engine.rootContext()->setContextProperty("imagePath", imagePath);
    
          QUrl videoPath;
          const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation);
          if (moviesLocation.isEmpty())
              videoPath = appPath.resolved(QUrl("./"));
          else
              videoPath = QString("%1").arg(moviesLocation.first());
          engine.rootContext()->setContextProperty("videoPath", videoPath);
    
          QUrl homePath;
          const QStringList homesLocation = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
          if (homesLocation.isEmpty())
              homePath = appPath.resolved(QUrl("/"));
          else
              homePath = QString("%1").arg(homesLocation.first());
          engine.rootContext()->setContextProperty("homePath", homePath);
    
          QUrl desktopPath;
          const QStringList desktopsLocation = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);
          if (desktopsLocation.isEmpty())
              desktopPath = appPath.resolved(QUrl("/"));
          else
              desktopPath = QString("%1").arg(desktopsLocation.first());
          engine.rootContext()->setContextProperty("desktopPath", desktopPath);
    
          QUrl docPath;
          const QStringList docsLocation = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);
          if (docsLocation.isEmpty())
              docPath = appPath.resolved(QUrl("/"));
          else
              docPath = QString("%1").arg(docsLocation.first());
          engine.rootContext()->setContextProperty("docPath", docPath);
    
    
          QUrl tempPath;
          const QStringList tempsLocation = QStandardPaths::standardLocations(QStandardPaths::TempLocation);
          if (tempsLocation.isEmpty())
              tempPath = appPath.resolved(QUrl("/"));
          else
              tempPath = QString("%1").arg(tempsLocation.first());
          engine.rootContext()->setContextProperty("tempPath", tempPath);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
    }
    

    在 QML 中使用它

    ....
    ........
    ............
    Text{
    text:"This is the applications path: " + appPath
    + "\nThis is the users home directory: " + homePath
    + "\nThis is the Desktop path: " desktopPath;
    }
    

    【讨论】:

    【解决方案5】:

    感谢 RedX 和 Kaz 的回答。我不明白为什么它给出了exe的路径。我找到了另一种方法:

    QString pwd("");
    char * PWD;
    PWD = getenv ("PWD");
    pwd.append(PWD);
    cout << "Working directory : " << pwd << flush;
    

    它不如单行优雅......但它对我有用。

    【讨论】:

    • 我也用 QFileInfo(".").absolutePath() 得到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2012-06-12
    • 2013-05-14
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多