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

为什么目录字符串丢失'/';将在Qt中返回父qdir,qt,Qt,它可能是一只虫子。请阅读网络选择答案 如果QFileInfo(文件名)丢失“/”,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.absol

它可能是一只虫子。请阅读网络选择答案

如果QFileInfo(文件名)丢失“/”,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”的父目录。因此,我将从希望目录中获取错误的EntryList

我是否应该在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();

e:/QtExample/mytest/out/res/res1/res
是指向名为“res”的目录的路径,
e:/QtExample/mytest/out/res/res1/
是指向空目录(名为“”)的路径。因此,是否应该添加斜杠取决于您正在尝试做什么

在我个人看来,最好不要添加最后一个斜杠,因为如果需要的话,添加它很容易,而删除它却不那么简单。

从文档中:

将文件的绝对路径作为QDir对象返回


对于“/foo/bar”,文件是“bar”,其目录是/foo。不管bar是目录还是普通文件,因为目录也是文件。如果您想要“对于文件,返回父目录,对于目录,返回目录本身”,您必须通过
QFileInfo::isDir
编写您自己的小功能测试,以了解返回的内容。

如果您深入到
absoluteDir()
函数调用,您将看到为什么会发生这种情况。在Windows中,调用
qfsfileengine\u win.cpp
中的
fileName
函数。此函数中有以下代码部分:

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);
}
if(文件==绝对路径名){
int slash=ret.lastIndexOf(QLatin1Char('/');
如果(斜杠<0)
返回ret;
else if(ret.at(0)!=QLatin1Char('/')&斜杠==2)
ret.left(3);//包含斜杠
其他的
返回ret.left(斜线>0?斜线:1);
}

可以看到,它返回最后一个分隔符左边的字符串部分。我不知道这是期望的行为还是bug。也许你可以为此发布一个
Qt
bug。关于这件事的文件不清楚。

也许我没有明白你的意思。但正如您所看到的,这两个QDir::absolutePath是不同的。QFileInfo文件(“e:/QtExample/mytest/out/res/res1/”;QFileInfo文件编号(“e:/QtExample/mytest/out/res/res1”);QString strDirFile1=file.absoluteDir().absolutePath();QString strDirFile_no1=文件号absoluteDir().absolutePath();因此,如果我使用第一个QDir,将得到正确的文件列表,但另一个将出错。谢谢你的回答。因此,如果我想得到正确的QDir对象,我应该添加斜杠…酷!!!你是对的!!!!我跟踪代码,发现问题代码与您编写的代码相同。Qt使用错误的Qstring构造错误的QDir!非常感谢。你首先发现了这个bug,你会自己发布它吗?我不知道为什么Qt开发人员使用Qstring.left来替代正确的路径。使用错误的Qstring路径返回空qdir是一个很好的解决方案吗?我刚刚跟踪了代码,你发现了这个bug,所以请随意发布这个bug:)解决方案非常简单。它应该检查提供的字符串是否是dir。如果是,则返回它,否则返回最后一个分隔符左侧的字符串。