一、简介

QDir类用来访问目录结构及其内容,可以操作路径名、访问路径和文件相关信息以及操作底层的文件系统,还可以访问Qt的资源系统。Qt使用“/”作为通用的目录分隔符和URLs的目录分隔符,如果使用“/”作为目录分隔符,Qt会自动转换路径来适应底层的操作系统。QDir可以使用相对路径或者绝对路径来指向一个文件,使用绝对路径的例子:

  1. QDir dir("/home/user/Documents"); //Linux系统
  2. QDir dir("C:/Documents and Settings"); //Windows系统

在Windows系统上,使用上面第二个例子中的路径访问文件时,会将其转换为"C:\Documents and Settings"。下面是一个相对路径的例子:

  1. QDir dir("image/landscape.png");

二、目录及导航操作

QDir类对象所关联的目录路径可以使用path()函数获得,可以使用setPath()方法来设置新的路径,可以使用方法absolutePath()来获得目录的绝对路径。

  • 目录名可以使用dirName()函数获取,如果QDir代表当前目录,那么会返回“.”。
  • 使用exists()函数检测目录是否存在,使用refresh()方法来刷新目录内容。
  • 可以使用isRelative()和isAbsolute()来判断一个QDir是否使用了相对路径或者绝对路径。
  • 目录的路径也可以使用cd()和cdUp()函数来改变,当使用一个存在的目录的名字来调用cd()后,QDir对象就会转换到指定的目录;而cdUp()会跳转到父目录。
  • 可以使用mkdir()来创建目录,使用rename()进行重命名,使用rmdir()删除目录。

示例程序如下:

  1. #include <QtCore/QCoreApplication>
  2. #include <QDir>
  3. #include <QDebug>
  4. #include <iostream>
  5. int main(int argc, char *argv[])
  6. {
  7. QCoreApplication a(argc, argv);
  8. QDir dir("./image/cleanreportTXT");
  9. if(!dir.exists())
  10. {
  11. qDebug() << ("未找到文件夹路径");
  12. return -1;
  13. }
  14. qDebug() << "目录相对路径:" << dir.path(); //QDir初始化使用的是相对路径
  15. qDebug() << "目录绝对路径:" << dir.absolutePath();
  16. qDebug() << "目录名称:" << dir.dirName();
  17. qDebug() << "是否使用了相对路径:" << dir.isRelative();
  18. qDebug() << "是否使用了绝对路径:" << dir.isAbsolute();
  19. //转换到指定的目录
  20. dir.cd("../");
  21. qDebug() << "目录绝对路径:" << dir.absolutePath() << endl;
  22. dir.cd("./image/cleanreportTXT"); //转换到原目录下
  23. //创建目录
  24. dir.mkdir("../newDir");
  25. //修改目录名
  26. dir.rename("../newDir","../oldDir");
  27. //删除目录
  28. qDebug() << "是否删除目录?(yes/no):";
  29. char str[3];
  30. std::cin.getline(str,3);
  31. if(strcmp(str,"yes"))
  32. dir.rmdir("../oldDir");
  33. else if(strcmp(str,"no"))
  34. qDebug() << "不删除目录!";
  35. else
  36. qDebug() << "输入错误!";
  37. return a.exec();
  38. }

执行程序,控制台输出如下:

  1. 目录相对路径: "./image/cleanreportTXT"
  2. 目录绝对路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug/image/cleanreportTXT"
  3. 目录名称: "cleanreportTXT"
  4. 是否使用了相对路径: true
  5. 是否使用了绝对路径: false
  6. 文件个数: 4
  7. 目录绝对路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug/image"
  8. 是否删除目录?(yes/no):
  9. yes

三、文件及目录内容

文件系统中目录中一般包括文件、子目录及符号链接。

  • 可以使用count()方法来获得QDir类对象关联的目录中的条目数目;
  • 可以使用过滤器来获取指定类型的文件,当文件符合过滤器指定条件时被保留,过滤器中的内容实际上是一个stringList。
  • 可以使用entryList()获取目录中所有条目的名称,返回类型为QStringList;可以使用entryInfoList()来获取目录中所有条目的QFileInfo内容,返回类型为QFileInfoList;
  • 可以使用filePath()及absoluteFilePath()来获得QDir中指定文件的路径名,但这两个函数均不检查指定的文件是否存在;
  • 可以使用remove()方法来删除指定文件;

示例程序如下:

  1. #include <QtCore/QCoreApplication>
  2. #include <QDir>
  3. #include <QDebug>
  4. #include <iostream>
  5. #include <QDateTime>
  6. int main(int argc, char *argv[])
  7. {
  8. QCoreApplication a(argc, argv);
  9. QDir dir("./image/cleanreportTXT");
  10. if(!dir.exists())
  11. {
  12. qDebug() << ("未找到文件夹路径");
  13. return -1;
  14. }
  15. /********* 过滤之前 ************/
  16. qDebug() <<"/*** 过滤之前 ***/";
  17. //entryList():获取目录中所有条目的名称
  18. QStringList strList_name1 = dir.entryList();
  19. qDebug() << "所有条目的名称:" << strList_name1;
  20. //count():获取文件个数
  21. qDebug() << "文件个数:" << dir.count() << endl << endl;
  22. /********* 过滤之后 *********/
  23. qDebug() <<"/*** 过滤之后 ***/";
  24. //setFilter():设置过滤:列出文件和不列出符号链接
  25. dir.setFilter(QDir::Files | QDir::NoSymLinks);
  26. //entryList():获取目录中所有条目的名称
  27. QStringList strList_name2 = dir.entryList();
  28. qDebug() << "所有条目的名称:" << strList_name2;
  29. //count():获取文件个数
  30. qDebug() << "文件个数:" << dir.count() << endl;
  31. //entryInfoList():获取目录中所有条目的QFileInfo内容
  32. QFileInfoList fileInfo2 = dir.entryInfoList();
  33. //显示第一个文件的QFileInfo内容:文件名称、文件后缀、文件大小、创建时间、修改时间和最近一次读取时间
  34. qDebug() << "文件名称:" << fileInfo2.at(0).fileName();
  35. qDebug() << "文件后缀:" << fileInfo2.at(0).suffix();
  36. qDebug() << "文件大小:" << fileInfo2.at(0).size();
  37. qDebug() << "创建时间:" << fileInfo2.at(0).created().toString("yyyy-MM-dd hh:mm:ss");
  38. qDebug() << "修改时间:" << fileInfo2.at(0).lastModified().toString("yyyy-MM-dd hh:mm:ss");
  39. qDebug() << "最近一次读取时间:" << fileInfo2.at(0).lastRead().toString("yyyy-MM-dd hh:mm:ss") << endl;
  40. //filePath()、absoluteFilePath():获取指定文件的相对路径和绝对路径
  41. qDebug() << "指定文件相对路径:" << dir.filePath("./1.txt");
  42. qDebug() << "指定文件绝对路径:" << dir.absoluteFilePath("./1.txt");
  43. return a.exec();
  44. }

执行程序,控制台输出如下:

  1. /*** 过滤之前 ***/
  2. 所有条目的名称: (".", "..", "1.txt", "2.txt", "3.txt", "4.txt", "car.ico", "qtcreator.exe - 快捷方式.lnk", "ROS_Robot_Programming_CN.docx", "加速器.png")
  3. 文件个数: 10
  4. /*** 过滤之后 ***/
  5. 所有条目的名称: ("1.txt", "2.txt", "3.txt", "4.txt", "car.ico", "ROS_Robot_Programming_CN.docx", "加速器.png")
  6. 文件个数: 7
  7. 文件名称: "1.txt"
  8. 文件大小: 34
  9. 创建时间: "2019-06-17 18:01:51"
  10. 修改时间: "2019-06-13 16:33:31"
  11. 最近一次读取时间: "2019-06-17 18:01:51"
  12. 指定文件相对路径: "./image/cleanreportTXT/./1.txt"
  13. 指定文件绝对路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug/image/cleanreportTXT/./1.txt"

四、当前目录及其他特定路径

可以使用一些静态函数来访问指定的路径,这些函数返回一个QDir对象:

示例程序如下:

  1. #include <QtCore/QCoreApplication>
  2. #include <QDir>
  3. #include <QDebug>
  4. #include <iostream>
  5. #include <QDateTime>
  6. int main(int argc, char *argv[])
  7. {
  8. QCoreApplication a(argc, argv);
  9. //QDir::current():返回应用程序的工作目录
  10. QDir dir1(QDir::current());
  11. qDebug() << "应用程序的工作目录路径:" << dir1.currentPath();
  12. //QDir::home():返回用户home目录
  13. QDir dir2(QDir::home());
  14. qDebug() << "用户home目录路径:" << dir2.homePath();
  15. //QDir::root():返回root根目录
  16. QDir dir3(QDir::root());
  17. qDebug() << "root根目录路径:" << dir3.rootPath();
  18. //QDir::root():返回系统存放临时文件的目录
  19. QDir dir4(QDir::temp());
  20. qDebug() << "系统存放临时文件的目录路径:" << dir4.tempPath();
  21. return a.exec();
  22. }

执行程序,控制台输出如下:

  1. 应用程序的工作目录路径: "F:/Project/C++/Qt/src/myDir/build-myDir-Desktop_Qt_5_9_7_MinGW_32bit-Debug"
  2. 用户home目录路径: "C:/Users/feng"
  3. root根目录路径: "C:/"
  4. 系统存放临时文件的目录路径: "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,目录仍然会被放在前面,但是按照反向的顺序,文件仍然排在目录后面,当然也是按照反向的顺序。

参考:

58 QT读取和写入文件

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

Qt文本读写之二:目录操作的更多相关文章

  1. Qt文本读写之一:输入输出设备和文件操作

    一.输入输出设备 QIODevice类是Qt中所有I/O设备的基础接口类,为诸如QFile.QBuffer和 QTcpSocket等支持读/写数据块的设备提供了一个抽象接口.QIODevice类是抽象 ...

  2. HDFS API 操作实例(二) 目录操作

    1. 递归读取文件名 1.1 递归实现读取文件名(scala + listFiles) /** * 实现:listFiles方法 * 迭代列出文件夹下的文件,只能列出文件 * 通过fs的listFil ...

  3. Qt文件读写操作

    原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html QFile Class 1.read读文件 加载文件对象  QFile file(&qu ...

  4. Python::OS 模块 -- 文件和目录操作

    os模块的简介参看 Python::OS 模块 -- 简介 os模块的进程管理 Python::OS 模块 -- 进程管理 os模块的进程参数 Python::OS 模块 -- 进程参数 os模块中包 ...

  5. 文件读写(二)利用SteamReader和StreamWrite类处理字符串、FileSystemWatcher、BinaryReader/BinaryWriter

    一.读写类: TextReader/TextWriter:文本读写,抽象类 TextReader,其派生类: StreamReader:以一种特定的编码从字节流中读取字符. StringReader: ...

  6. Python之文件与目录操作及压缩模块(os、shutil、zipfile、tarfile)

    Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读取或写入 os.path模块 文件路径操作 os模块 文件和目录简单操作 zipfile模 ...

  7. 零基础学Python--------第10章 文件及目录操作

    第10章 文件及目录操作 10.1 基本文件操作 在Python中,内置了文件(File)对象.在使用文件对象时,首先需要通过内置的open() 方法创建一个文件对象,然后通过对象提供的方法进行一些基 ...

  8. Python基础之文件和目录操作

    1 .文件操作 1.1 文件打开和关闭 在python, 使用 open 函数, 可以打开一个已经存在的文件, 或者创建一个新文件. # 打开文件 f = open('test.txt', 'w') ...

  9. 【转】Python之文件与目录操作(os、zipfile、tarfile、shutil)

    [转]Python之文件与目录操作(os.zipfile.tarfile.shutil) Python中可以用于对文件和目录进行操作的内置模块包括: 模块/函数名称 功能描述 open()函数 文件读 ...

随机推荐

  1. VMWare 14 Workstation Pro 下载与安装

    1.双击安装运行 2.下一步 3.接受 下一步 4.自定义安装路径,下一步 5.下一步,取消勾选加入vmware客户体验 6.下一步 7.安装 8.安装中 9.完成 10.点击许可证安装 输入:FF3 ...

  2. HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA

    状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j]  ...

  3. 设计模式学习笔记——Decorator装饰模式

    装饰模式的作用或动机就是,尽量避免继承,而使用关联.原因是层层继承下来,内容会越来越多,有失控的危险.就扩展性而言,用关联比用继承好.所谓的关联,A使用了B,就叫A关联了B. Component 抽象 ...

  4. JavaScript算法题(一) && 数组reduce使用

    可参考Array.reduce用法 1. 请编写getMissingElement函数,返回给定数组中缺少的元素(数组里的元素为0~9,只会缺失一个). Example: getMissingElem ...

  5. CocoaPods初体验

    之前没用过cocoapods,但是新项目需要用到. 安装cocoapods: 按照官方的: $ sudo gem install cocoapods    // 但是什么都没有发生 升级gem $ s ...

  6. 微信公众号菜单与应用交互session

    http://www.cnblogs.com/yank/p/3476874.html http://blog.csdn.net/zmhawk/article/details/43671195 http ...

  7. 常用文件操作模块json,pickle、shelve和XML

    一.json 和 pickle模块 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Js ...

  8. cassandra cpp driver中bind list——用cass_statement_bind_collection函数

    CassError insert_into_collections(CassSession* session, const char* key, const char* items[]) { Cass ...

  9. codeforces 665E E. Beautiful Subarrays(trie树)

    题目链接: E. Beautiful Subarrays time limit per test 3 seconds memory limit per test 512 megabytes input ...

  10. 无限轮播器的bug修复

    前言:上一回实现了轮播器的自动滚动,但是有两个需要处理的bug. 1.增加需求:当用手拖拽控制轮播器的时候,停止自动滚动. 2.当同一个页面中有tableView,textView或scrollvie ...