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

isAbsolute()

是否为绝对路径
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的更多相关文章

  1. QT学习笔记8:QDir类及其用法总结

    简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ...

  2. Qt:路径问题小结

    在做Qt项目的时候,我们难免遇到到文件路径问题. 如QFile file("text.txt")加载不成功.QPixmap("../text.png") 加载图 ...

  3. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  4. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  5. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  6. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  7. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

  8. Qt:QUrl构造时的qrc前缀

    参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...

  9. QT:用QWebSocket实现webchannel,实现C++与HTML通信

    基本原理是通过channel将C++对象暴露给HTML,在HTML中调用qwebchannel.js.前提是建立transport,QT只提供了一个抽象基类QWebChannelAbstractTra ...

随机推荐

  1. mpfu 位编辑处理?

    1.  国内的不用处理,其余都做 2.  判断是否是mp   的项目 3  设置位数编辑    请求中    和  检查中都要做 4  以某一画面作为基准,修改不同的值. 5  对象外的数据直接设置在 ...

  2. LeetCode673

    LeetCode每日一题2021.9.20 LeetCode673. 最长递增子序列的个数 思路 在最长上升子序列的转移时,维护一个 cnt 数组,表示 以 i 结尾的最长上升子序列个数 f[i] 表 ...

  3. django入门 03 模板语法

    变量值从views.py传入html 基本语法 {{ abc }} 变量abc外,用双大括号包裹 {% for item in abc %} 语句外,用大括号+百分号包裹 1. 传递字符串 views ...

  4. SpringBoot的.gitignore文件使用

    简介 临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交.git提供了一个.gitignore,来自动忽略这些配置文件 配置规则 # 表示此为注释,将被Gi ...

  5. java中构造函数和一般函数的区别

    构造方法 特点: 1.方法名称和类名相同 2.不用定义返回值类型 3.不可以写return语句 作用: 给对象初始化 构造方法的细节: 当一个类中没有定义构造函数时,系统会默认添加一个无参的构造方法. ...

  6. Maven 项目报出警告:Warning:java: source value 1.5 is obsolete and will be removed in a future release

    感谢原文作者:Hxinguan 原文链接:https://www.cnblogs.com/Hxinguan/p/6132446.html 问题: 1.创建maven项目的时候,jdk版本是1.5版本, ...

  7. android怎么做表格显示数据

    实现思路:最底层(父级)背景为黑色,最上层(子级)背景为白色,然后父子组件之间存在一丝间隔即可显示出类似边框的线. 本次主要利用Android中的TableRow等实现,其他类比也可以实现效果. &l ...

  8. 解析视频真实地址播放 By HL

    手思3.0启动,从手思1.0版的iOS2个人,到现在的N个人,如今又回来做手思了. 重新做自然就要比之前的更好,更强大,而视频播放页的效果相当的不乐观. 公司用的是优酷的视频连接,只能用webview ...

  9. 流量录制与回放在vivo的落地实践

    一.为什么要使用流量录制与回放? 1.1 vivo业务状况 近几年,vivo互联网领域处于高速发展状态,同时由于vivo手机出货量一直在国内名列前茅,经过多年积累,用户规模非常庞大.因此,vivo手机 ...

  10. VS Code Java 2 月更新!教育特别版:单元测试、GUI开发支持、Gradle项目创建、以及更多!

    新春快乐!欢迎来到 Visual Studio Code Java 的 2 月更新,这个月我们给大家带来了一期教育特别版.每年的年初是许多学校开学的时间,为了给学生和教师提供在 Visual Stud ...