QT QDir

235 篇文章 186 订阅

QDir类提供了对目录结构及其内容的访问。

QDir用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它也可以用来访问Qt的资源系统。

Qt使用"/"作为通用的目录分隔符,就像在url中使用"/"作为路径分隔符一样。如果您总是使用“/”作为目录分隔符,Qt将转换您的路径以符合底层操作系统。

QDir可以使用相对路径或绝对路径指向文件。绝对路径以目录分隔符开始(在Windows下,可选前面是驱动器规范)。相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。

绝对路径示例:

QDir("/home/user/Documents")
QDir("C:/Documents and Settings")


在Windows上,上面的第二个示例用于访问文件时将被转换为C:\Documents and Settings。

相对路径示例:

QDir("images/landscape.png")


您可以使用isRelative()或isAbsolute()函数来检查QDir是使用相对文件路径还是绝对文件路径。调用makeAbsolute()将相对QDir转换为绝对QDir。

导航和目录操作

可以使用path()函数获取目录的路径,并使用setPath()函数设置新的路径。一个目录的绝对路径可以通过调用absolutePath()来找到。

目录的名称可以使用dirName()函数找到。这通常返回绝对路径中指定目录位置的最后一个元素。然而,如果QDir表示当前目录,它也可以返回"."。

QDir("Documents/Letters/Applications").dirName() // "Applications"
QDir().dirName()                                 // "."


目录的路径也可以用cd()和cdUp()函数更改,它们的操作方式类似于熟悉的shell命令。当使用现有目录的名称调用cd()时,QDir对象更改目录,以代替它表示该目录。cdUp()函数改变QDir对象的目录,使其引用其父目录;即cd("..")相当于cdUp()。

可以使用mkdir()创建目录,使用rename()重命名目录,使用rmdir()删除目录。

您可以使用exists()来测试给定名称的目录是否存在,并且可以使用isReadable()、isAbsolute()、isRelative()和isRoot()来测试目录的属性。

refresh()函数从磁盘重新读取目录数据。

文件和目录内容

目录包含许多表示文件、目录和符号链接的条目。目录中的条目数由count()返回。一个目录中所有条目的名字的字符串列表可以通过entryList()获得。如果您需要关于每个条目的信息,请使用entryInfoList()来获取QFileInfo对象列表。

目录中的文件和目录的路径可以使用filePath()和absoluteFilePath()构造。函数的作用是:返回指定文件或目录相对于QDir对象的路径;absoluteFilePath()返回指定文件或目录的绝对路径。这两个函数都不检查文件或目录是否存在;它们只建造路径。

QDir directory("Documents/Letters");
QString path = directory.filePath("contents.txt");
QString absolutePath = directory.absoluteFilePath("contents.txt");


可以使用remove()函数来删除文件。目录不能像文件一样被删除;使用rmdir()来删除它们。

通过对QDir对象应用过滤器,可以减少entryList()和entryInfoList()返回的条目的数量。您可以应用名称筛选器来指定带有通配符的模式,文件名需要匹配,属性筛选器可以选择条目的属性,并可以区分文件和目录,以及排序顺序。

名称过滤器是传递给setNameFilters()的字符串列表。属性过滤器由按位或组合的过滤器组成,在调用setFilter()时指定这些过滤器。排序顺序是使用setSorting()和SortFlags的位OR组合来指定的。

您可以使用match()函数来测试文件名是否与过滤器匹配。

在调用entryList()和entryInfoList()时也可以指定过滤器和排序顺序标志,以覆盖之前定义的行为。

当前目录和其他特殊路径

通过许多返回QDir对象的静态函数提供了对一些常见目录的访问。也有相应的返回字符串的函数:

QDirQStringReturn Value
current()currentPath()The application's working directory
home()homePath()The user's home directory
root()rootPath()The root directory
temp()tempPath()The system's temporary directory

静态函数setCurrent()也可以用来设置应用程序的工作目录。

如果你想找到包含应用程序可执行文件的目录,请参见QCoreApplication::applicationDirPath()。

静态函数提供了包含文件系统的每个设备的根目录列表。在Unix系统上,这将返回一个包含单个根目录"/"的列表;在Windows上,列表通常包含C:/,可能还有其他的驱动器号,如D:/,这取决于用户的系统配置。

路径操作和字符串

包含“。”元素(在路径的该点引用当前目录)、“..”元素(引用父目录)和符号链接的路径可以使用canonicalPath()函数简化为规范形式。

路径也可以通过使用cleanPath()来删除冗余的"/"和".."元素来简化。

有时需要能够以用户平台的本机表示形式显示路径。静态toNativeSeparators()函数返回指定路径的副本,其中每个目录分隔符都被底层操作系统的适当分隔符替换。

例子

检查目录是否存在:

QDir dir("example");
if (!dir.exists())
    qWarning("Cannot find the example directory");

(我们也可以使用静态便利函数QFile::exists())

遍历目录并读取文件:

QDir dir = QDir::root();                 // "/"
if (!dir.cd("tmp")) {                    // "/tmp"
    qWarning("Cannot find the \"/tmp\" directory");
} else {
    QFile file(dir.filePath("ex1.txt")); // "/tmp/ex1.txt"
    if (!file.open(QIODevice::ReadWrite))
        qWarning("Cannot create the file %s", file.name());
}

列出当前目录中所有文件(不包括符号链接)的程序,按大小排序,最小的优先:

#include <QDir>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QDir dir;
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Size | QDir::Reversed);

    QFileInfoList list = dir.entryInfoList();
    std::cout << "     Bytes Filename" << std::endl;
    for (int i = 0; i < list.size(); ++i) {
        QFileInfo fileInfo = list.at(i);
        std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)
                                                .arg(fileInfo.fileName()));
        std::cout << std::endl;
    }
    return 0;
}

参见QFileInfo, QFile, QFileDialog, QCoreApplication::applicationDirPath()和Find Files Example。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值