在C ++中从父文件夹的父级提供文件位置

时间:2017-11-20 07:32:15

标签: c++ qt file

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

已执行的文件位于

C:\ A \ B \ C \ d \将Test.exe

我需要打开的文件是

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

但我想动态地这样做。所以text.exe的配置应该给A到A和F的路径。因为这个程序可以位于任何地方,我不想给出从C开始的路径:\

任何帮助都会得到满足。如果有帮助,我也会使用QT。感谢

编辑:

我正在寻找像

这样的东西
<a href="../../other/file.pdf">file.pdf</a>

in 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

2 个答案:

答案 0 :(得分:1)

这是一个有效的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

答案 1 :(得分: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
}