1.绝对路径、相对路径

绝对路径与相对路径关于绝对路径和相对路径的概念就不多说了,具体看在qt中的运用,比如文件当前路径下有一个“1.txt”的文本文件:

Qt引用项目相对路径下的Opencv库 qt设置相对路径_开发语言

那么相对路径就是“1.txt”如下图所示:

Qt引用项目相对路径下的Opencv库 qt设置相对路径_Qt引用项目相对路径下的Opencv库_02

 程序运行后打印了“exist”,说明路径没有问题。

本例中的这个文件绝对路径也就是“F:/QtProject/filepath/1.txt",改为这个运行后也是打印“exist”。

一般代码中都是比较推荐使用绝对路径的不推荐使用相对路径。并且要注意不同操作系统使用的斜杠不同,Linux和window系统是相反的。 

那么比如一个文件放在程序目录下在代码中怎么获取他的绝对路径了?qt有一个方法“currentPath”

比如本例中就可以写为“QDir::currentPath() + "/1.txt"”。

2.路径的拼接

处理文件很多时候会涉及到文件路径的拼接,比如上面给的例子用的currentPath那个就算是,拼接加入使用纯QString去处理的话就会很容易出错,比如某文件路径path=dir(文件所在目录里)+“/"+filaName(文件名)。这里比如dir末尾包含了斜杆,然后没注意又加了一个斜杆导致路径错误或者使用的是正斜杠但是在linux下不同,总之使用起来比较麻烦,所以可以使用Qt的一个方法“cleanPath”。比如本例子中路径可以写为“QDir::cleanPath(QDir::currentPath() + QDir::separator() + "1.txt")”。然后程序运行可以看到还是打印“exist”。使用“cleanPath”和“separator”就避免了上面所说会遇到的问题。比如上面我把路径多写了斜杠:

QString path = QDir::cleanPath(QString("F:/QtProject/filepath/") + QDir::separator() + QString("/1.txt"))

程序运行还是打印的是“exist”。

Qt引用项目相对路径下的Opencv库 qt设置相对路径_绝对路径_03

假如使用QString进行字符串拼接就会出错。处理文件路径以及文件名相关的获取与设置最后不要过度使用字符串的拼接与裁剪比如你想要通过一个文件的绝对路径获取他的文件名,可能会有人用字符串分割来做但是容易出问题就直接采用qt的方法就行,还是以本例为例通过绝对路径获取对应文件名:

QString path     = QDir::cleanPath(QString("F:/QtProject/filepath/") + QDir::separator() + QString("/1.txt"));
    QString fileName = QFileInfo(path).fileName();

 

Qt引用项目相对路径下的Opencv库 qt设置相对路径_Qt引用项目相对路径下的Opencv库_04

使用QFileInfo来辅助获取直接一步到胃跟不需要字符串的截取。

3.工作目录和运行目录

我之前碰到一个问题,程序自己测试完没问题结果到了现场却出现了问题,然后通过现场发来的日志分析是没有找到对应的文件,然后让现场的测试到对应目录下却发现文件都在并没有缺少。最后才发现客户运行我们程序和我们并不一样,还是以上面的例子为例:

#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString          path = QDir::cleanPath(QDir::currentPath() + QDir::separator() + QString("/1.txt"));
    if (QFile::exists(path))
        qDebug() << "exist!";
    else
        qDebug() << "not exist";
    return a.exec();
}

Qt引用项目相对路径下的Opencv库 qt设置相对路径_开发语言_05

程序在这个目录下面对应文件也在这个目录下面,然后使用命令行启动:

Qt引用项目相对路径下的Opencv库 qt设置相对路径_qt_06

没有问题。

但是我不在当前目录下使用命令行来启动这个程序

Qt引用项目相对路径下的Opencv库 qt设置相对路径_qt_07

我在他得上一层得上一层目录启动结果却打印是“not exist”。这就涉及到了工作目录和运行目录得区别了。关于这两个得概念具体不多介绍,简单来说就是:工作目录是指当前目录,运行目录是指exe所在路径。所以将1.txt放到对应命令行执行得目录就行,当然这肯定不是最终得解决办法,最终得解决办法就是使用“QCoreApplication::applicationDirPath()”,即为exe所在得目录。

QString path = QDir::cleanPath(QCoreApplication::applicationDirPath() + QDir::separator() + QString("/1.txt"));

Qt引用项目相对路径下的Opencv库 qt设置相对路径_绝对路径_08

这样不管在哪个目录使用命令行就会正常打印“exist”说明程序找到了对应得文件。所以本例中文件路径最终写法是“QDir::cleanPath(QCoreApplication::applicationDirPath() + QDir::separator() + QString("1.txt"))”,看着虽然麻烦但是不会出错。另外贴一个纯C++获取运行目录得方法

/**
 * @brief 获取运行目录,末尾带分隔符
 * @return
 */
static string appDirPath() {
    string str = "";
#ifdef _WIN32
    char exeFullPath[MAX_PATH];
    WCHAR adirPath[256];
    GetModuleFileName(NULL, adirPath, MAX_PATH);
    vector<string> llist;
    sprintf(exeFullPath, "%ws", adirPath);
    str = (string)exeFullPath;
    int pos = str.find_last_of('\\', str.length());
    str = str.substr(0, pos + 1);
#elif __linux__
    char szbuffer[64];
    int ret = readlink("/proc/self/exe", szbuffer, sizeof(szbuffer) - 1);
    str = (string)szbuffer;
    int pos = str.find_last_of('/', str.length());
    str = str.substr(0, pos + 1);
#endif
    return str;
}