Qt:QDir
0、说明
QDir提供了访问目录及目录下内容的类。
QDir既可以用于访问文件系统,也可以用于访问Qt 资源系统(Qt's resource system.)。
Qt用 "/" 作为目录分隔符,此外,"/" 也是URL的路径分隔符。
QDir可以指向一个用相对路径或绝对路径指明的文件。绝对路径在不同系统下不同,Linux系统下,以文件分隔符"/"开始,如:"/home/user/Documents";在Windows系统下,以某个磁盘开始,如:"C:/Documents and Settings"。相对路径直接以目录名、文件名开头,指明一个相对于当前目录的路径,如:"images/landscape.png"。
我们可以用isRelative()和isAbsolute()来检查一个QDir是绝对还是相对的。调用makeAbsolute()可以将一个相对路径的QDir转换为绝对路径的QDir。
规范化路径:不含".."、"."、逻辑链接的路径(把这些简写的路径写全),绝对路径与相对路径中都可以含有这些路径。
逻辑链接:Linux系统中路径中的local代表根目录,如果根目录为usr,规范化路径中的local就会变成usr。
1)导航与目录操作
①路径
目录路径可以通过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()
2)文件与目录的内容
①路径上的要素
目录路径上有一系列的要素:文件、目录、符号链接。要素的数量通过count()得到,它们的名字通过entryList()保存在一个QStringList中,如果我们需要每个要素的信息,可以通过entryInfoList()来获取一个QList<QFileInfo>。
②构造路径、移除
通过filePath()、absoluteFilePath()构造一个从QDir指定的目录到某个文件、目录的绝对路径与相对路径。不过它们都不会检查该路径是否存在,它们仅仅用于构造路径:
QDir directory("Documents/Letters");
QString path = directory.filePath("contents.txt");
QString absolutePath = directory.absoluteFilePath("contents.txt");
通过remove()移除文件,通过rmdir()移除目录。
③filter
在用entryList()与entryInfoList()获取要素时,可以引入过滤器来筛选符合要求的要素:例如筛选包含某子串的文件、分离文件与目录等:
名字filter通过QStringList传入setNameFilters()进行构建;
属性filter通过多个用OR连接的Filter进行构建,方法是setFilter();
排序顺序由setSorting()传入的一系列用OR(即 | )连接的SortFlags构建。
可以通过match()来检查某个文件名是否符合filter。
3)当前目录与其他路径
有两类static方法用于获取路径,一类返回QDir,一类返回QString:
| QDir | QString | Return 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()。
drives()方法给出了该文件系统的所有根目录构成的List。在Unix系统中,返回一个包含单个"/"的List,它就是系统根目录。在Windows系统下,它会返回包含系统所有盘的QList<QFileInfo>。
4)路径操作与字符串
Path中如果包含元素 ".",说明是当前目录;包含"..",说明是parent目录;包含逻辑链接说明是规范目录,规范目录通过canonicalPath()构建。
通过cleanPath()可以简化path,移除path中多余的"/"与".."。
有时我们需要构造一些自制分隔符的路径,可以用toNativeSeparators()。
5)例子
①检查目录是否存在:exists()
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());
}
列出当前目录下的所有文件,按文件size从小到大排列:
#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;
}
1、模块和加载项
| Header: | #include <QDir> |
| qmake: | QT += core |
2、构造
| QDir(QString path, QString nameFilter, QDir::SortFlags sort = SortFlags(Name | IgnoreCase), QDir::Filters filters = AllEntries) | 用path构造QDir,nameFilter指定过滤的元素 |
| QDir(QString path = QString()) | 构造QDir指向path,如果path为空,则程序工作目录"."会被使用 |
| QDir(QDir dir) | 另一个QDir的副本 |
3、静态字段
| enum | Filter { Dirs, AllDirs, Files, Drives, NoSymLinks, …, CaseSensitive } | 用于entryList() 和entryInfoList()中,描述了筛选选项。 |
| flags | Filters | |
| enum | SortFlag { Name, Time, Size, Type, Unsorted, …, LocaleAware } | 用于entryList() 和entryInfoList()中的排序,按照 名字、大小、时间 等等排序 |
| flags | SortFlags |
5、静态方法
返回值类型 |
方法 |
说明 |
| void | addSearchPath(QString prefix, QString path) | 为path加前缀prefix |
| QString | cleanPath(QString path) | 移除path中冗余的分隔符,"."和".." |
| QDir | current() | 当前目录对应的QDir |
| QString | currentPath() | 当前目录的绝对路径 |
| QFileInfoList | drives() | 系统根目录的list |
| QString | fromNativeSeparators(QString pathName) | 用指定分隔符进行路径分割,默认用"/" |
| QDir | home() | home目录 |
| QString | homePath() | home目录的路径 |
| bool | isAbsolutePath(QString path) | 是否为绝对路径 |
| bool | isRelativePath(QString path) | 是否为相对路径 |
| QChar | listSeparator() |
path分隔符: Unix下是":" Windows下是";" |
| bool |
match(QString filter, QString fileName) match(QStringList filters, QString fileName) |
检查fileName是否符合filter的规则 |
| QDir | root() | 根目录QDir |
| QString | rootPath() | 根目录路径 |
| QStringList | searchPaths(QString prefix) | prefix的检索目录 |
| QChar | separator() | 目录分隔符:Unix中是"/";Windows中是"\" |
| bool | setCurrent(QString path) | 设置当前工作目录 |
| void | setSearchPaths(QString prefix, QStringList searchPaths) | 给搜索路径searchPaths加前缀prefix |
| QDir | temp() | 返回系统的临时目录QDir |
| QString | tempPath() | 临时目录路径 |
| QString | toNativeSeparators(QString pathName) | 将pathName中的"/"分隔符转换系统分隔符,返回转换后的路径 |
6、实例方法
返回值类型 |
方法 |
说明 |
|
QDir & bool bool QString |
operator=(QDir dir) operator!=(QDir dir) operator==(QDir dir) operator[](int pos) |
赋值 两个QDir的路径是否相同,并不是QDir是否相等。 dir[i]:提取路径中第i个元素。等同于entryList().at(i) |
| QString | absoluteFilePath(QString fileName) | 返回指定文件的绝对路径,并不检查文件是否存在。冗余分隔符并不会被去除(通过cleanPath()去除) |
| absolutePath() | 返回QDir的绝对路径。 | |
| canonicalPath() | 返回规范化路径。 | |
| bool | cd(QString dirName) |
改变QDir到dirName指定的目录。 与命令行窗口中的cd指令类似。 |
| bool | cdUp() | 改变QDir到上一级目录 |
| uint | count() | 计算路径上的元素数(目录数+文件数) |
| QString | dirName() | 目录名 |
|
QFileInfoList QStringList |
entryInfoList(QStringList nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) entryList(QStringList nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) |
路径上的元素(目录+文件)及其信息 |
| bool |
exists(QString name) exists() |
指定路径是否存在 当前QDir对应的路径是否存在 |
| QString | filePath(QString fileName) | 返回当前目录下的fileName的路径,不管是否存在,不检查冗余分隔符。 |
| QDir::Filters | filter() | setFilter()设置的Filter值 |
| bool | 是否为绝对路径 | |
| isEmpty(QDir::Filters filters = Filters(AllEntries | NoDotAndDotDot)) | 目录是否为空目录 | |
| isReadable() | 是否可读 | |
| isRelative() | 是否为相对路径 | |
| isRoot() | 是否为根目录 | |
| bool | makeAbsolute() | 将QDir的路径转为绝对路径 |
| mkdir(QString dirName) | 新建目录 | |
| mkpath(QString dirPath) | 新建路径上的所有目录 | |
| QStringList | nameFilters() | 返回setNameFilters()设置的QStringList |
| QString | path() |
返回路径,可能包含逻辑链接,但不包含冗余.和..和分隔符。 可以是绝对路径和相对路径 |
| void | refresh() | 文档刷新 |
| QString | relativeFilePath(QString fileName) | 返回fileName相较于QDir之间的路径 |
| bool | remove(QString fileName) | 移除文件 |
| removeRecursively() | 移除QDir指定的目录,包括它的内容 | |
| rename(QString oldName, QString newName) | 重命名 | |
| rmdir(QString dirName) |
移除目录,该目录必须为空 要删除目录和目录下的内容用removeRecursively() |
|
| rmpath(QString dirPath) | 移除路径dirPath,并且会一级一级删除它的父目录(在父目录只包含一个目录的时候) | |
| void | setFilter(QDir::Filters filters) | 设置用于entryList() 和 entryInfoList()提取元素的Filter |
| setNameFilters(QStringList nameFilters) | 设置用于entryList() 和 entryInfoList()提取元素的Filter List | |
| setPath(QString path) |
设置QDir路径为path,该路径是clean的,可以是绝对和相对路径。 不检查路径是否存在。 |
|
| setSorting(QDir::SortFlags sort) | 设置用于entryList() 和 entryInfoList()提取元素的排序算法 | |
| QDir::SortFlags | sorting() | 返回setSorting()的值 |
| void | swap(QDir &other) | 互换两个QDir的值 |
Qt:QDir的更多相关文章
- QT学习笔记8:QDir类及其用法总结
简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ...
- Qt:路径问题小结
在做Qt项目的时候,我们难免遇到到文件路径问题. 如QFile file("text.txt")加载不成功.QPixmap("../text.png") 加载图 ...
- Qt:禁止qDebug的输出
Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT
- Qt:使用自定义的字体
Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体 QFontDatabase::addApplicationFont("XENOTRON.TTF" ...
- Qt:QJsonObject
0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...
- Qt:QJsonValue
0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...
- Qt:QJsonArray
0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...
- Qt:QUrl构造时的qrc前缀
参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...
- QT:用QWebSocket实现webchannel,实现C++与HTML通信
基本原理是通过channel将C++对象暴露给HTML,在HTML中调用qwebchannel.js.前提是建立transport,QT只提供了一个抽象基类QWebChannelAbstractTra ...
随机推荐
- 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录
目录 沁恒CH32F103C8T6(一): Keil5环境配置,示例运行和烧录 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录 StdPeriphLi ...
- 字节跳动的一道python面试题
#!/usr/bin/python #coding=utf-8 #好好学习,天天向上 lst = ['hongkong','xiantyk','chinat','guangdong','z'] lst ...
- docker k8s安装
docker安装 删除依赖包 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docke ...
- VUE3 之 作用域插槽 - 这个系列的教程通俗易懂,适合新手
1. 概述 破窗效应告诉我们: 当一个建筑物窗户的玻璃完好无损时,很少有人想去破坏它,当有一个人破坏了一块窗户的玻璃,其他窗户的玻璃也很快会被人破坏. 同理,一个很干净的地方,人们不好意思去丢垃圾,但 ...
- AT2163 [AGC006B] Median Pyramid Easy
需要一点灵感的题目. 可以发现这样一个事情,当三个数中有两个数相同时,中为数一定是这两个相同的数. 基于这个观察,我们想让每一行都存在这样两个相同的两个数,就一定能保证第一层的值为 \(x\) 了. ...
- 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足
前言 PC网页吊起支付宝支付界面报了如下这么个错误: 我明明申请的支付宝支付功能列表的签约已经生效了呀!怎么回事呢? 解决 支付宝商户中心:https://b.alipay.com/signing/p ...
- Ubuntu安装 php + apache + mysql
转载请注明来源:https://www.cnblogs.com/hookjc/ 1.安装SSH(必须) sudo apt-get install ssh 2.安装MySQL(虽然现在最新版为5.1,但 ...
- EPF:一种基于进化、协议感知和覆盖率引导的网络协议模糊测试框架
本文系原创,转载请说明出处:from 信安科研人 目录 实验 工具的安装 1.安装AFL++ 2.安装epf 对IEC104协议库进行fuzz 实验准备 使用AFL++中的编译器插桩 开始fuzz 原 ...
- 有手就行7——*项目构建细节2-钩子(webhook) 配置
有手就行7--*项目构建细节2-钩子(webhook) 配置 钩子服务 1)开启webhook功能 使用root账户登录到后台,点击Admin Area -> Settings -> N ...
- 降维处理PCA
要理解什么是降维,书上给出了一个很好但是有点抽象的例子. 说,看电视的时候屏幕上有成百上千万的像素点,那么其实每个画面都是一个上千万维度的数据:但是我们在观看的时候大脑自动把电视里面的场景放在我们所能 ...