为什么目录字符串丢失'/'将返回Qt中的父qdir

时间:2011-12-02 07:55:10

标签: qt

这可能是一个错误。请阅读 webclectic 回答。

如果QFileInfo(filename)丢失'/',QDir :: absolutePath将返回父字符串。如下面的代码。

QFileInfo file("e:/QtExample/mytest/out/res/res1/");
QFileInfo file_no("e:/QtExample/mytest/out/res/res1");

QDir dirFile = file.absoluteDir();
QDir dirFile_no = file_no.absoluteDir();

QString strDirFile = dirFile.absolutePath(); //"E:/QtExample/mytest/out/res/res1
QString strDirFile_no = dirFile_no.absolutePath(); //"E:/QtExample/mytest/out/res

我用QTreeView找到了它。我的代码将从QTreeView :: clicked signals

调用插槽
connect(ui.m_pView,SIGNAL(clicked(QModelIndex)),this,SLOT(myClicked(QModelIndex)));

插槽将获取QModelIndex,然后我使用QFileSystemMode :: fileInfo获取QFileInfo。

QFileInfo rFileInfo = m_model.fileInfo(index);
QDir absDir = rFileInfoDir.absoluteDir();    

但是QFileInfo的返回总是返回“e:/ QtExample / mytest / out / res / res”,所以如果我调用QFileInfo :: absoluteDir获取目录,则该目录是“res1”的父目录。所以我会从我的希望目录中获取错误的条目。

我应该在absoluteFilePath()之后添加'/'来获得正确的QDir吗?

为什么strDirPath等于“E:/ QtExample / mytest / out / res / res1”,但rDir会列出“res”目录入口列表?

//rFileInfoDir == E:/QtExample/mytest/out/res/res1
QString strDirPath = rFileInfoDir.absoluteFilePath();
QDir rDir = rFileInfoDir.absoluteDir();

3 个答案:

答案 0 :(得分:2)

如果您深入了解absoluteDir()函数调用,您将会看到为什么会发生这种情况。在Windows中,调用fileName中的qfsfileengine_win.cpp函数。在这个函数中有这个代码部分:

if (file == AbsolutePathName) {
        int slash = ret.lastIndexOf(QLatin1Char('/'));
        if (slash < 0)
            return ret;
        else if (ret.at(0) != QLatin1Char('/') && slash == 2)
            return ret.left(3);      // include the slash
        else
            return ret.left(slash > 0 ? slash : 1);
}

您可以看到它返回最后一个分隔符左侧字符串的一部分。我不知道这是不是想要的行为或错误。也许您可以为此发出Qt错误。关于此事的文件不清楚。

答案 1 :(得分:1)

来自QFileInfo::absoluteDir()文档:

  

以QDir对象的形式返回文件的绝对路径。

在“/ foo / bar”的情况下,文件为“bar”,其目录为/ foo。 bar是目录还是普通文件无关紧要,因为目录也是文件。如果你想要“为文件,返回父目录,对于目录,返回目录本身”,你必须通过QFileInfo::isDir编写自己的小函数测试,以便返回。

答案 2 :(得分:0)

e:/QtExample/mytest/out/res/res1/res是名为“res”的目录的路径,e:/QtExample/mytest/out/res/res1/是空目录(称为“”)的路径。所以你是否应该添加斜杠取决于你想要做什么。

在我个人看来,最好不要添加最终斜杠,因为如果需要,可以很容易地添加它,而删除它并不是那么简单。