我是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
答案 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
}