【问题标题】:Giving file location from parent of the parent folder in C++从 C++ 中的父文件夹的父级提供文件位置
【发布时间】:2017-11-20 07:32:14
【问题描述】:

我是 C++ 的新手,我知道这是一个基本问题,但无法从任何地方找到令人满意的答案,所以我将从父文件夹中读取文件位置,但我不知道如何。

执行的文件在

C:\A\B\C\D\Test.exe

我需要打开的文件在

C:\A\E\F\Open.exe

但我想动态地执行此操作。所以 text.exe 的配置应该给出 A 的路径,然后是 E 和 F。因为这个程序可以位于任何地方,我不想给出从 C:\

开始的路径

如有任何帮助,我们将不胜感激。如果有帮助,我也在使用 QT。谢谢

编辑:

我正在寻找类似的东西

<a href="../../other/file.pdf">file.pdf</a>

在html中

编辑 2: 这是我的代码,但它不起作用

QSettings setting("config.ini",QSettings::IniFormat);
QString prolocation = setting.value("ProDir","../../../E/F/pro.exe").toString();

QProcess process;
process.start(prolocation);

配置文件是:

(bla bla其他设置)

ProDir=../../../E/F/pro.exe

【问题讨论】:

  • 目录C:\A是固定的,永远不会变吗?
  • 它不是固定的,它肯定会改变,这就是问题
  • 您可以使用QSetting 作为路径的配置。
  • 好的,那么A 会一直在C: 的根目录下吗?然后只需创建一个包含"C:/" 的字符串并根据需要附加目录。
  • @Someprogrammerdude 它不会总是在 C 上:它甚至可以在 USB 上

标签: c++ qt file


【解决方案1】:

你也可以使用QUrl::resolved

使用“..”调用resolved() 会返回一个QUrl,其目录比原始目录高一级。同样,使用“../..”调用 resolved() 会从路径中删除两个级别。如果 relative 为“/”,则路径变为“/”。

QUrl oBase("file:///home/A/B/");
QString oResolvedFile = oBase.resolved(QUrl("../../other/file.pdf")).toString();

// Test 
QFile oLocalFile(QUrl(oResolvedFile).toLocalFile());
if (oLocalFile.exists())
{
    // your file
}

【讨论】:

  • 我在配置文件中给出了类似“../../other/file.pdf”的文件位置。 t 做对了,但没有打开进程。我使用 Qstring qwe = setting.value("blabla","../../other/file.pdf").toString();我没有 QUrl 基础,因为它可能会改变我如何以这种方式使用已解决
  • @SamedSivaslıoğlu 您获得了正确的文件路径,但无法打开它?您可以分享您的代码以查看实际不起作用的代码吗? :)
  • 谁来更改基本 URL?从配置?由用户?如果用户更改了它,您可以从 QFileDialog::getExistingDirectory 获取它
  • 我把我的代码放到了这个问题上。顺便说一句,感谢您的所有帮助@Simon,您很棒:D
【解决方案2】:

这是一个有效的 Qt 解决方案

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <cassert>

int main(int argc, char **argv)
{
  // Init + get app path
  //
  QCoreApplication app(argc, argv);

  QString appPath = app.applicationDirPath();
  qInfo() << appPath;

  // App path manips
  //
  QDir dir(appPath);

  // Goes up two times... your C\D dirs
  bool ok;
  ok = dir.cdUp();
  assert(ok);
  ok = dir.cdUp();
  assert(ok);

  qInfo() << dir.path();

  // Goes to picaud/Temp again
  // -> in your case /E/F dirs
  ok = dir.cd("picaud");
  assert(ok);
  ok = dir.cd("Temp");
  assert(ok);

  qInfo() << dir.path();
}

哪个打印:

"/home/picaud/Temp"
"/home"
"/home/picaud/Temp"

就您而言,就像您已经使用 Qt 一样,我认为这是最简单的方法。您仍然可以使用 C++ 标准 filesystem,但这需要使用 C++17 或使用 Boost initial implementation

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2012-09-21
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多