Qt QDir详解

文章目录

  • 基于QT6.2.0
  • 一.常用方法
    • 1.判断文件是否存在
    • 2.读取文件
    • 3.创建文件夹和路径
    • 4.遍历文件
  • 二.QDir类详解
    • 1.初始化
    • 2.导航和目录操作
    • 3.文件和目录内容
    • 4.当前目录和其他特殊路径
    • 5.路径操作和字符串
  • 三.全部函数说明
    • 成员函数
    • 静态函数

基于QT6.2.0

一.常用方法

1.判断文件是否存在

QDir dir("example");
//也可以直接使用静态函数 QFile::exists()
 if (!dir.exists())
     qWarning("Cannot find the example directory");

2.读取文件

 QDir dir = QDir::root(); // 路径为"/"
 if (!dir.cd("tmp")) // 进入"/tmp"路径
 {                   
     qWarning("Cannot find the \"/tmp\" directory");
 }
 else
 {
     QFile file(dir.filePath("ex1.txt")); // file的路径为"/tmp/ex1.txt"
     if (!file.open(QIODevice::ReadWrite)) //以可读可写方式打开文件
         qWarning("Cannot create the file %s", file.name());
 }

3.创建文件夹和路径

  • mkdir 创建文件夹,路径下的父文件夹要是不存在,就会创建失败
  • mkpath创建路径,路径下不存在的文件夹和文件都会创建
QDateTime timeCurrent = QDateTime::currentDateTime(); //获取系统时间
QString time_day = timeCurrent.toString("20yyMMdd"); //日期转换为Qstring
QString time_hour = timeCurrent.toString("hhmmss"); //时间转换为Qstring
QString path_dir = QString("../0.results/%1/%3_%1_%2.csv").arg(time_day).arg(time_hour).arg(fileName); //根据时间设置保存路径
QDir dir(path_dir); //使用路径创建QDir对象
if(!dir.exists()) //判断文件夹是否存在,不存在则创建
{
    qDebug() << "no such dir";
    if(dir.mkpath(dir.absolutePath()))
    {
       qDebug() << "creat dir success:" << dir.absolutePath();
    }
    else
    {
        qDebug() << "creat dir failed" << dir.absolutePath();
    }
}

4.遍历文件

在遍历文件时,可以对过滤器进行设置,用来赛选需要的文件,对于entryList()entryInfoList()。通过使用按位OR运算符组合以下列表中的值来指定过滤器值:

内容 描述
QDir::Dirs 0x001 列出与筛选器匹配的目录
QDir::AllDirs 0x400 列出所有目录
QDir::Files 0x002 列出文件
QDir::Drives 0x004 列出磁盘驱动器(在Unix下忽略)
QDir::NoSymLinks 0x008 不要列出符号链接(被不支持符号链接的操作系统忽略)
QDir::NoDotAndDotDot NoDot | NoDotDot 不要列出特殊条目".“和”…"
QDir::NoDot 0x2000 不要列出特殊条目"."
QDir::NoDotDot 0x4000 不要列出特殊条目"…"
QDir::AllEntries Dirs | Files | Drives 列出目录、文件、驱动器和符号链接(除非指定系统,否则不会列出损坏的符号链接)
QDir::Readable 0x010 列出应用程序具有读取权限的文件。Readable值需要与Dirs或Files组合
QDir::Writable 0x020 列出应用程序具有写入权限的文件。可写值需要与Dirs或Files组合
QDir::Executable 0x040 列出应用程序具有执行权限的文件。Executable值需要与Dirs或Files组合
QDir::Modified 0x080 仅列出已修改的文件(在Unix上忽略)
QDir::Hidden 0x100 列出隐藏文件(在Unix上,以“.”开头的文件)
QDir::System 0x200 列出系统文件(在Unix上,包括FIFO、套接字和设备文件;在Windows上,包括.lnk文件)
QDir::CaseSensitive 0x800 过滤器应区分大小写

还可以通过设置QDir::SortFlag对获取到的文件信息进行排序,排序值是通过对以下列表中的值进行“或”运算来指定的:

内容 描述
QDir::Name 0x00 按名称排序
QDir::Time 0x01 按时间排序(修改时间)
QDir::Size 0x02 按文件大小排序
QDir::Type 0x80 按文件的扩展名进行排序
QDir::Unsorted 0x03 不进行排序
QDir::NoSort -1 默认情况下不排序
QDir::DirsFirst 0x04 首先放目录,然后放文件
QDir::DirsLast 0x20 先放文件,然后放目录
QDir::Reversed 0x08 颠倒排序顺序
QDir::IgnoreCase 0x10 不区分大小写排序
QDir::LocaleAware 0x40 使用当前区域设置对项目进行适当排序

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

#include 
#include 

 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;
 }

二.QDir类详解

1.初始化

QDir用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它也可用于访问Qt的资源系统。
Qt使用“/”作为通用目录分隔符,其方式与URL中的“/”用作路径分隔符相同。如果始终使用“/”作为目录分隔符,Qt会转换路径以符合底层操作系统。
QDir可以使用相对路径或绝对路径指向文件。绝对路径以目录分隔符开头(在Windows下,可以选择前面加驱动器规范)。相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。

 //绝对路径示例
 QDir("/home/user/Documents")
 QDir("C:/Users")
 //相对路径示例
 QDir("images/landscape.png")
  • 可以使用isRelative()isAbsolute()函数来检查QDir是使用相对还是绝对文件路径。
  • 调用makeAbsolute()将相对QDir转换为绝对QDir。
  • 以冒号(:)开头的路径始终被视为绝对路径,因为它们表示QResource

2.导航和目录操作

可以使用path()函数获取目录的路径,并使用setPath()函数设置新路径。通过调用absolutePath()可以找到目录的绝对路径。使用dirName()函数可以找到目录的名称。这通常返回绝对路径中指定目录位置的最后一个元素。但是,如果QDir表示当前目录,它也可以返回“.”

  • 目录的路径也可以使用cd()cdUp()函数来更改,这两个函数的操作方式都类似于shell命令。当用现有目录的名称调用cd()时,QDir对象会更改目录,从而表示该目录。cdUp()函数更改QDir对象的目录,使其引用其父目录;即cd(“…”)等同于cdUp()。
  • 目录可以用mkdir()创建,用rename()重命名,用rmdir()删除。
  • 可以使用exists()测试具有给定名称的目录是否存在,并且可以使用isReadable()isAbsolute()isRelative()isRoot()来测试目录的属性。
  • 使用refresh()函数从磁盘重新读取目录的数据
 QDir("Documents/Letters/Applications").dirName() // 返回"Applications"
 QDir().dirName()                                 // 返回"."

3.文件和目录内容

目录包含许多条目,表示文件、目录和符号链接。

  • count()返回目录中的条目数。
  • 可以使用entryList()获取目录中所有条目名称的字符串列表。如果需要每个条目的信息,请使用entryInfoList()获取QFileInfo对象的列表。
  • 可以使用filePath()absoluteFilePath()构造目录中文件和目录的路径。filePath()函数返回相对于QDir对象路径的指定文件或目录的路径;absoluteFilePath()返回指定文件或目录的绝对路径。这些函数都不检查文件或目录的存在;它们只构建路径。
  • 可以使用remove()函数删除文件。目录不能以与文件相同的方式删除;改用rmdir()删除它们。
  • 通过对QDir对象应用过滤器,可以减少entryList()entryInfoList()函数返回的条目数量。可以应用名称过滤器来指定文件名需要匹配的通配符模式,选择条目属性并可以区分文件和目录的属性过滤器,以及排序顺序。名称筛选器是传递给setNameFilters()的字符串列表。属性过滤器由过滤器的按位OR组合组成,这些过滤器在调用setFilter()时指定。排序顺序是使用setSorting()SortFlags的按位OR组合指定的。
  • 可以使用match()函数测试文件名是否与筛选器匹配。在调用entryList()entryInfoList()时,也可以指定过滤器和排序顺序标志,以覆盖先前定义的行为。
 QDir directory("Documents/Letters");
 QString path = directory.filePath("contents.txt");
 QString absolutePath = directory.absoluteFilePath("contents.txt");

4.当前目录和其他特殊路径

通过QDir对象的静态函数可以访问一些公共目录。也有相应的函数返回字符串:

QDir QString 返回对象
current() currentPath() 应用程序的工作目录
home() homePath() 用户主目录
root() rootPath() 系统根目录
temp() tempPath() 系统暂时目录
  • setCurrent()静态函数也可用于设置应用程序的工作目录。
  • 如果要查找包含应用程序可执行文件的目录,参阅QCoreApplication::applicationDirPath()
  • drives()静态函数为包含文件系统的每个设备提供根目录列表。在Unix系统上,这将返回一个包含单个根目录“/”的列表;在Windows上,根据用户系统的配置,列表通常会包含C:/,以及可能的其他驱动器字母,如D:/。

5.路径操作和字符串

  • 包含引用路径中当前目录的“.”元素、引用父目录的“…”元素和符号链接的路径可以使用canonicalPath()函数简化为规范形式。
    还可以通过使用cleanPath()删除冗余的“/”和“…”元素来简化路径。

     QString bin = "/local/bin"; // 其中/local/bin是指向/usr/bin的符号链接
     QDir binDir(bin);
     QString canonicalBin = binDir.canonicalPath(); // canonicalBin现在等于“/usr/bin”
    
     QString ls = "/local/bin/ls";  // 其中ls是可执行文件“ls”
     QDir lsDir(ls);
     QString canonicalLs = lsDir.canonicalPath(); //canonicalLS现在等于“/usr/bin/ls”。
    
  • 有时需要能够在用户平台的本地表示中显示路径。静态toNativeSeparators()函数返回指定路径的副本,其中每个目录分隔符都由底层操作系统的适当分隔符替换。

三.全部函数说明

成员函数

返回值 函数 说明
QDir(const std::filesystem::path &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(Name IgnoreCase), QDir::Filters filters = AllEntries)
QDir(const std::filesystem::path &path) 构造函数
QDir(const QString &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(Name IgnoreCase), QDir::Filters filters = AllEntries)
QDir(const QString &path = QString()) 构造函数
QDir(const QDir &dir) 构造函数
QString absoluteFilePath(const QString &fileName) const 返回目录中文件的绝对路径名。不检查文件是否实际存在于目录中;不会删除fileName中的冗余多个分隔符或".“和”…"目录
QString absolutePath() const 返回绝对路径(以“/”或驱动器规范开头的路径),该路径可能包含符号链接,但绝不包含冗余的".“、”…"或多个分隔符。
QString canonicalPath() const 返回规范路径,即没有符号链接或冗余".“或”…"元素的路径
bool cd(const QString &dirName) 将QDir的目录更改为dirName
bool cdUp() 通过从QDir的当前目录上移一个目录来更改目录
uint count() const 返回目录中目录和文件的总数
QString dirName() const 返回目录的名称
QFileInfoList entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const 返回目录中所有文件和目录的QFileInfo对象列表,根据之前使用setNameFilters()和setFilter()设置的名称和属性筛选器排序,并根据使用 setSorting()设置设置的标志排序
QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const 上一个函数的重载函数
QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const 返回目录中所有文件和目录的名称列表,根据之前使用setNameFilters()和setFilter()设置的名称和属性筛选器排序,并根据使用 setSorting()设置设置的标志排序
QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const 上一个函数的重载函数
bool exists(const QString &name) const 如果名为name的文件存在,则返回true;否则返回false
bool exists() const 上一个函数的重载函数
QString filePath(const QString &fileName) const 返回目录中文件的路径名。不检查文件是否实际存在于目录中。如果QDir是相对的,则返回的路径名也将是相对的。不会删除fileName中的冗余多个分隔符或".“和”…"目录
std::filesystem::path filesystemAbsolutePath() const 将absolutePath()返回为std::filesystem::path
std::filesystem::path filesystemCanonicalPath() const 将canonicalPath()返回为std::filesystem::path
std::filesystem::path filesystemPath() const 将path()返回为std::filesystem::path
QDir::Filters filter() const 返回setFilter()设置的值
bool isAbsolute() const 如果目录的路径是绝对路径,则返回true;否则返回false
bool isEmpty(QDir::Filters filters = Filters(AllEntries NoDotAndDotDot)) const
bool isReadable() const 如果目录可读并且我们可以按名称打开文件,则返回true;否则返回false
bool isRelative() const 如果目录路径是相对的,则返回true;否则返回false。(在Unix下,如果路径不以"/"开头,则路径是相对的)
bool isRoot() const 如果目录是根目录,则返回true;否则返回false
bool makeAbsolute() 将目录路径转换为绝对路径。如果它已经是绝对的,什么都不会发生。如果转换成功,则返回true;否则返回false
bool mkdir(const QString &dirName) const 创建名为dirName的子目录,成功时返回true;否则返回false。如果调用此函数时目录已存在,则返回false
bool mkpath(const QString &dirPath) const 创建目录路径dirPath。该函数将创建创建目录所需的所有父目录。如果成功,则返回true;否则返回false。如果调用此函数时路径已存在,则返回true
QStringList nameFilters() const 返回 setNameFilters()设置的字符串列表
QString path() const 返回路径。这可能包含符号链接,但绝不包含多余的".“、”…"或多个分隔符
void refresh() const 刷新目录信息
QString relativeFilePath(const QString &fileName) const 返回相对于目录的fileName路径
bool remove(const QString &fileName) 删除文件fileName
bool removeRecursively() 删除目录,包括其所有内容
bool rename(const QString &oldName, const QString &newName) 将文件或目录从oldName重命名为newName,如果成功则返回true;否则返回false
bool rmdir(const QString &dirName) const 删除dirName指定的目录,目录必须为空,rmdir()才能成功
bool rmpath(const QString &dirPath) const 删除目录路径dirPath,该函数将删除dirPath中的所有父目录,前提是它们为空。这与mkpath(dirPath)相反。
void setFilter(QDir::Filters filters) 将 entryList()和 entryInfoList()使用的筛选器设置为筛选器。过滤器用于指定entryList()和entryInfoList()应返回的文件类型。
void setNameFilters(const QStringList &nameFilters) 将 entryList()和 entryInfoList()使用的名称筛选器设置为nameFilters指定的筛选器列表。
void setPath(const QString &path) 将目录的路径设置为路径。清除路径中的冗余".“、”…"和多个分隔符。不检查具有此路径的目录是否实际存在;
void setPath(const std::filesystem::path &path) 上一个函数的重载函数
void setSorting(QDir::SortFlags sort) 设置entryList()和 entryInfoList()使用的排序顺序
QDir::SortFlags sorting() const 返回 setSorting()设置的值
void swap(QDir &other) 将此QDir实例与其他实例交换

静态函数

返回值 函数原型 说明
void addSearchPath(const QString &prefix, const QString &path) 将路径添加到前缀的搜索路径
void addSearchPath(const QString &prefix, const std::filesystem::path &path) 将路径添加到前缀的搜索路径
QString cleanPath(const QString &path) 返回标准化目录分隔符(即,平台本机分隔符转换为"/“)并删除冗余分隔符的路径,并尽可能解析”.“s和”…"s
QDir current() 返回应用程序的当前目录
QString currentPath() 返回应用程序当前目录的绝对路径。当前目录是用QDir::setCurrent()设置的最后一个目录,如果从未调用过,则是父进程启动此应用程序的目录
QFileInfoList drives() 返回此系统上根目录的列表
QString fromNativeSeparators(const QString &pathName) 使用"/“作为文件分隔符返回pathName。例如,在Windows上,fromNativeSeparators(“c:\winnt\system32”)返回"c:\winnt/system32”
QDir home() 返回用户的主目录
QString homePath() 返回用户主目录的绝对路径
bool isAbsolutePath(const QString &path) 如果路径是绝对路径,则返回true;如果是相对的,则返回false
bool isRelativePath(const QString &path) 如果路径是相对的,则返回true;如果是绝对值,则返回false
QChar listSeparator() 返回本机路径列表分隔符:Unix下的":“和Windows下”;"
bool match(const QString &filter, const QString &fileName) 如果fileName与通配符(glob)模式筛选器匹配,则返回true;否则返回false。过滤器可以包含由空格或分号分隔的多个模式。匹配不区分大小写
bool match(const QStringList &filters, const QString &fileName) 上面函数的重载函数
QDir root() 返回根目录
QString rootPath() 返回根目录的绝对路径,对于Unix操作系统,返回"/“。对于Windows文件系统,通常返回"c:/”
QStringList searchPaths(const QString &prefix) 返回前缀的搜索路径
QChar separator() 返回本机目录分隔符:Unix下为"/“,Windows下为”"
bool setCurrent(const QString &path) 将应用程序的当前工作目录设置为路径。如果目录已成功更改,则返回true;否则返回false。
void setSearchPaths(const QString &prefix, const QStringList &searchPaths) 使用searchPaths的前缀前缀设置或替换Qt的文件名搜索路径
QDir temp() 返回系统的临时目录
QString tempPath() 返回系统临时目录的绝对规范路径
QString toNativeSeparators(const QString &pathName) 返回pathName,其中"/“分隔符转换为适用于基础操作系统的分隔符。
在Windows上,to NativeSeparators(“c:\winnt/system32”)返回"c:\wint\system32”

你可能感兴趣的:(QT,qt,开发语言,c++)