Qt文本读写之二:目录操作
一、简介
QDir类用来访问目录结构及其内容,可以操作路径名、访问路径和文件相关信息以及操作底层的文件系统,还可以访问Qt的资源系统。Qt使用“/”作为通用的目录分隔符和URLs的目录分隔符,如果使用“/”作为目录分隔符,Qt会自动转换路径来适应底层的操作系统。QDir可以使用相对路径或者绝对路径来指向一个文件,使用绝对路径的例子:
QDir dir("/home/user/Documents"); //Linux系统
QDir dir("C:/Documents and Settings"); //Windows系统
在Windows系统上,使用上面第二个例子中的路径访问文件时,会将其转换为"C:\Documents and Settings"。下面是一个相对路径的例子:
QDir dir("image/landscape.png");
二、目录及导航操作
QDir类对象所关联的目录路径可以使用path()函数获得,可以使用setPath()方法来设置新的路径,可以使用方法absolutePath()来获得目录的绝对路径。
- 目录名可以使用dirName()函数获取,如果QDir代表当前目录,那么会返回“.”。
- 使用exists()函数检测目录是否存在,使用refresh()方法来刷新目录内容。
- 可以使用isRelative()和isAbsolute()来判断一个QDir是否使用了相对路径或者绝对路径。
- 目录的路径也可以使用cd()和cdUp()函数来改变,当使用一个存在的目录的名字来调用cd()后,QDir对象就会转换到指定的目录;而cdUp()会跳转到父目录。
- 可以使用mkdir()来创建目录,使用rename()进行重命名,使用rmdir()删除目录。
示例程序如下:
#include <QtCore/QCoreApplication>
#include <QDir>
#include <QDebug>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir("./image/cleanreportTXT");
if(!dir.exists())
{
qDebug() << ("未找到文件夹路径");
return -1;
}
qDebug() << "目录相对路径:" << dir.path(); //QDir初始化使用的是相对路径
qDebug() << "目录绝对路径:" << dir.absolutePath();
qDebug() << "目录名称:" << dir.dirName();
qDebug() << "是否使用了相对路径:" << dir.isRelative();
qDebug() << "是否使用了绝对路径:" << dir.isAbsolute();
//转换到指定的目录
dir.cd("../");
qDebug() << "目录绝对路径:" << dir.absolutePath() << endl;
dir.cd("./image/cleanreportTXT"); //转换到原目录下
//创建目录
dir.mkdir("../newDir");
//修改目录名
dir.rename("../newDir","../oldDir");
//删除目录
qDebug() << "是否删除目录?(yes/no):";
char str[3];
std::cin.getline(str,3);
if(strcmp(str,"yes"))
dir.rmdir("../oldDir");
else if(strcmp(str,"no"))
qDebug() << "不删除目录!";
else
qDebug() << "输入错误!";
return a.exec();
}
执行程序,控制台输出如下:
目录相对路径: "./image/cleanreportTXT"
目录绝对路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug/image/cleanreportTXT"
目录名称: "cleanreportTXT"
是否使用了相对路径: true
是否使用了绝对路径: false
文件个数: 4
目录绝对路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug/image"
是否删除目录?(yes/no):
yes
三、文件及目录内容
文件系统中目录中一般包括文件、子目录及符号链接。
- 可以使用count()方法来获得QDir类对象关联的目录中的条目数目;
- 可以使用过滤器来获取指定类型的文件,当文件符合过滤器指定条件时被保留,过滤器中的内容实际上是一个stringList。
- 可以使用entryList()获取目录中所有条目的名称,返回类型为QStringList;可以使用entryInfoList()来获取目录中所有条目的QFileInfo内容,返回类型为QFileInfoList;
- 可以使用filePath()及absoluteFilePath()来获得QDir中指定文件的路径名,但这两个函数均不检查指定的文件是否存在;
- 可以使用remove()方法来删除指定文件;
示例程序如下:
#include <QtCore/QCoreApplication>
#include <QDir>
#include <QDebug>
#include <iostream>
#include <QDateTime>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir("./image/cleanreportTXT");
if(!dir.exists())
{
qDebug() << ("未找到文件夹路径");
return -1;
}
/********* 过滤之前 ************/
qDebug() <<"/*** 过滤之前 ***/";
//entryList():获取目录中所有条目的名称
QStringList strList_name1 = dir.entryList();
qDebug() << "所有条目的名称:" << strList_name1;
//count():获取文件个数
qDebug() << "文件个数:" << dir.count() << endl << endl;
/********* 过滤之后 *********/
qDebug() <<"/*** 过滤之后 ***/";
//setFilter():设置过滤:列出文件和不列出符号链接
dir.setFilter(QDir::Files | QDir::NoSymLinks);
//entryList():获取目录中所有条目的名称
QStringList strList_name2 = dir.entryList();
qDebug() << "所有条目的名称:" << strList_name2;
//count():获取文件个数
qDebug() << "文件个数:" << dir.count() << endl;
//entryInfoList():获取目录中所有条目的QFileInfo内容
QFileInfoList fileInfo2 = dir.entryInfoList();
//显示第一个文件的QFileInfo内容:文件名称、文件后缀、文件大小、创建时间、修改时间和最近一次读取时间
qDebug() << "文件名称:" << fileInfo2.at(0).fileName();
qDebug() << "文件后缀:" << fileInfo2.at(0).suffix();
qDebug() << "文件大小:" << fileInfo2.at(0).size();
qDebug() << "创建时间:" << fileInfo2.at(0).created().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "修改时间:" << fileInfo2.at(0).lastModified().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "最近一次读取时间:" << fileInfo2.at(0).lastRead().toString("yyyy-MM-dd hh:mm:ss") << endl;
//filePath()、absoluteFilePath():获取指定文件的相对路径和绝对路径
qDebug() << "指定文件相对路径:" << dir.filePath("./1.txt");
qDebug() << "指定文件绝对路径:" << dir.absoluteFilePath("./1.txt");
return a.exec();
}
执行程序,控制台输出如下:
/*** 过滤之前 ***/
所有条目的名称: (".", "..", "1.txt", "2.txt", "3.txt", "4.txt", "car.ico", "qtcreator.exe - 快捷方式.lnk", "ROS_Robot_Programming_CN.docx", "加速器.png")
文件个数: 10
/*** 过滤之后 ***/
所有条目的名称: ("1.txt", "2.txt", "3.txt", "4.txt", "car.ico", "ROS_Robot_Programming_CN.docx", "加速器.png")
文件个数: 7
文件名称: "1.txt"
文件大小: 34
创建时间: "2019-06-17 18:01:51"
修改时间: "2019-06-13 16:33:31"
最近一次读取时间: "2019-06-17 18:01:51"
指定文件相对路径: "./image/cleanreportTXT/./1.txt"
指定文件绝对路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug/image/cleanreportTXT/./1.txt"
四、当前目录及其他特定路径
可以使用一些静态函数来访问指定的路径,这些函数返回一个QDir对象:
示例程序如下:
#include <QtCore/QCoreApplication>
#include <QDir>
#include <QDebug>
#include <iostream>
#include <QDateTime>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//QDir::current():返回应用程序的工作目录
QDir dir1(QDir::current());
qDebug() << "应用程序的工作目录路径:" << dir1.currentPath();
//QDir::home():返回用户home目录
QDir dir2(QDir::home());
qDebug() << "用户home目录路径:" << dir2.homePath();
//QDir::root():返回root根目录
QDir dir3(QDir::root());
qDebug() << "root根目录路径:" << dir3.rootPath();
//QDir::root():返回系统存放临时文件的目录
QDir dir4(QDir::temp());
qDebug() << "系统存放临时文件的目录路径:" << dir4.tempPath();
return a.exec();
}
执行程序,控制台输出如下:
应用程序的工作目录路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug"
用户home目录路径: "C:/Users/feng"
root根目录路径: "C:/"
系统存放临时文件的目录路径: "C:/Users/feng/AppData/Local/Temp"
五、QDir的Filter枚举变量
enum QDir::Filter 中常用的枚举变量值及其含义如下:
枚举值 | 含义 |
---|---|
QDir::Dirs | 列出目录 |
QDir::AllDirs | 列出所有目录,不对目录名进行过滤 |
QDir::Files | 列出文件 |
QDir::NoSymLinks | 不列出符号链接 |
QDir::Drives | 列出逻辑驱动器名称,该枚举变量在Linux/Unix中将被忽略 |
QDir::NoDotAndDotDot | 不列出文件系统中的特殊文件“.”及“..” |
QDir::NoDot | 不列出“.”文件,即指向当前目录的软链接 |
QDir::NoDotDot | 不列出“..”文件 |
QDir::AllEntries | 列出目录、文件、驱动器及软链接等所有文件 |
QDir::Readable | 列出当前应用有读权限的文件或目录 |
QDir::Writable | 列出当前应用有写权限的文件或目录 |
QDir::Executable | 列出当前应用有执行权限的文件或目录 |
QDir::Modified | 列出已被修改的文件,该值在Linux/Unix系统中将被忽略 |
QDir::Hidden | 列出隐藏文件 |
QDir::System | 列出系统文件 |
QDir::CaseSensitive | 设定过滤器为大小写敏感 |
六、Dir中的SortFlag枚举变量
这个枚举变量描述的是QDir如何排列由 entryList() 或 entryInfoList() 返回的条目。被指定的排列的值可以由下述列表中的值或运算得到:
枚举值 | 含义 |
---|---|
QDir::Name | 按名称排序 |
QDir::Time | 按时间排序(修改时间) |
QDir::Size | 按文件大小排序 |
QDir::Unsorted | 不排序 |
QDir::SortByMask | Name、Time和Size的掩码 |
QDir::DirsFirst | 首先是目录,然后是文件 |
QDir::IgnoreCase | 不区分大小写进行排序 |
QDir::DefaultSort | 内部标记 |
前四种中你只能指定一个。
如果你同时指定DirsFirst和Reversed,目录仍然会被放在前面,但是按照反向的顺序,文件仍然排在目录后面,当然也是按照反向的顺序。
参考:
Qt文本读写之二:目录操作的更多相关文章
- Qt文本读写之一:输入输出设备和文件操作
一.输入输出设备 QIODevice类是Qt中所有I/O设备的基础接口类,为诸如QFile.QBuffer和 QTcpSocket等支持读/写数据块的设备提供了一个抽象接口.QIODevice类是抽象 ...
- HDFS API 操作实例(二) 目录操作
1. 递归读取文件名 1.1 递归实现读取文件名(scala + listFiles) /** * 实现:listFiles方法 * 迭代列出文件夹下的文件,只能列出文件 * 通过fs的listFil ...
- Qt文件读写操作
原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html QFile Class 1.read读文件 加载文件对象 QFile file(&qu ...
- Python::OS 模块 -- 文件和目录操作
os模块的简介参看 Python::OS 模块 -- 简介 os模块的进程管理 Python::OS 模块 -- 进程管理 os模块的进程参数 Python::OS 模块 -- 进程参数 os模块中包 ...
- 文件读写(二)利用SteamReader和StreamWrite类处理字符串、FileSystemWatcher、BinaryReader/BinaryWriter
一.读写类: TextReader/TextWriter:文本读写,抽象类 TextReader,其派生类: StreamReader:以一种特定的编码从字节流中读取字符. StringReader: ...
- Python之文件与目录操作及压缩模块(os、shutil、zipfile、tarfile)
Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读取或写入 os.path模块 文件路径操作 os模块 文件和目录简单操作 zipfile模 ...
- 零基础学Python--------第10章 文件及目录操作
第10章 文件及目录操作 10.1 基本文件操作 在Python中,内置了文件(File)对象.在使用文件对象时,首先需要通过内置的open() 方法创建一个文件对象,然后通过对象提供的方法进行一些基 ...
- Python基础之文件和目录操作
1 .文件操作 1.1 文件打开和关闭 在python, 使用 open 函数, 可以打开一个已经存在的文件, 或者创建一个新文件. # 打开文件 f = open('test.txt', 'w') ...
- 【转】Python之文件与目录操作(os、zipfile、tarfile、shutil)
[转]Python之文件与目录操作(os.zipfile.tarfile.shutil) Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读 ...
随机推荐
- 1987年国际C语言混乱代码大赛获奖的一行代码
macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+ 这是CoolShell博主之前做了一个非常有意思的在线 ...
- POJ 1183 反正切函数的应用(数学代换,基本不等式)
题目链接:http://poj.org/problem?id=1183 这道题关键在于数学式子的推导,由题目有1/a=(1/b+1/c)/(1-1/(b*c))---------->a=(b*c ...
- 文件管理中心iOS APP (国外市场:File Center) 技术支持
文件管理中心iOS APP (国外市场:File Center) 技术支持网址:http://www.cnblogs.com/flychen/邮箱:592802944@qq.com
- node封装mysql模块
node是基于异步的,因此在进行数据库查询操作的通常是通过回调来操作查询结果.但是在有了es7的async/await,基本不再需要回调了,所以本篇是基于async/await对mysql进行一次操作 ...
- 迭代器模式(Iterator.hasNaxt())
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. ...
- js中数组遍历的几种方法及其区别
参考网站: http://www.cnblogs.com/lvmh/p/6104397.html 第一种最常用的:for循环 for(j = 0; j < arr.length; j++) { ...
- adb client, adb server, adbd原理浅析(附带我的操作过程)【转】
本文转载自:http://blog.csdn.net/stpeace/article/details/24933813 adb是什么? adb就是Android调试桥,很形象啊. 先来看adb原理的逻 ...
- YTU 2866: 结构体---点坐标结构体
2866: 结构体---点坐标结构体 时间限制: 1 Sec 内存限制: 128 MB 提交: 499 解决: 344 题目描述 定义一个表示点坐标的结构体,输入两个点的坐标,输出这两个点中点的坐 ...
- AndroidStudio——Android SDK
前言 安卓的SDK包,跨过长城下载好的,分享出来一下~ Android Studio版本 | 3.4.1 下载地址 微云下载地址 | 链接:https://share.weiyun.com/5rm6l ...
- UVA-10827(前缀和降维)
题意: 给一个n*n的正方形,第一行和最后一行粘在一块,第一列和最后一列粘在一块,求这个环面上的最大的子矩形; 思路: 直接暴力是O(n^6)的复杂度,可以把前缀和求出来,这样就可以只用枚举四条边界就 ...