当前位置:   article > 正文

Qt QDir详解_qdir判断文件夹是否存在

qdir判断文件夹是否存在

基于QT6.2.0

一.常用方法

1.判断文件是否存在

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

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());
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4.遍历文件

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

内容描述
QDir::Dirs0x001列出与筛选器匹配的目录
QDir::AllDirs0x400列出所有目录
QDir::Files0x002列出文件
QDir::Drives0x004列出磁盘驱动器(在Unix下忽略)
QDir::NoSymLinks0x008不要列出符号链接(被不支持符号链接的操作系统忽略)
QDir::NoDotAndDotDotNoDot | NoDotDot不要列出特殊条目".“和”…"
QDir::NoDot0x2000不要列出特殊条目"."
QDir::NoDotDot0x4000不要列出特殊条目"…"
QDir::AllEntriesDirs | Files | Drives列出目录、文件、驱动器和符号链接(除非指定系统,否则不会列出损坏的符号链接)
QDir::Readable0x010列出应用程序具有读取权限的文件。Readable值需要与Dirs或Files组合
QDir::Writable0x020列出应用程序具有写入权限的文件。可写值需要与Dirs或Files组合
QDir::Executable0x040列出应用程序具有执行权限的文件。Executable值需要与Dirs或Files组合
QDir::Modified0x080仅列出已修改的文件(在Unix上忽略)
QDir::Hidden0x100列出隐藏文件(在Unix上,以“.”开头的文件)
QDir::System0x200列出系统文件(在Unix上,包括FIFO、套接字和设备文件;在Windows上,包括.lnk文件)
QDir::CaseSensitive0x800过滤器应区分大小写

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

内容描述
QDir::Name0x00按名称排序
QDir::Time0x01按时间排序(修改时间)
QDir::Size0x02按文件大小排序
QDir::Type0x80按文件的扩展名进行排序
QDir::Unsorted0x03不进行排序
QDir::NoSort-1默认情况下不排序
QDir::DirsFirst0x04首先放目录,然后放文件
QDir::DirsLast0x20先放文件,然后放目录
QDir::Reversed0x08颠倒排序顺序
QDir::IgnoreCase0x10不区分大小写排序
QDir::LocaleAware0x40使用当前区域设置对项目进行适当排序

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

#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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

二.QDir类详解

1.初始化

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

 //绝对路径示例
 QDir("/home/user/Documents")
 QDir("C:/Users")
 //相对路径示例
 QDir("images/landscape.png")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 可以使用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()                                 // 返回"."
  • 1
  • 2

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");
  • 1
  • 2
  • 3

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

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

QDirQString返回对象
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”。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 有时需要能够在用户平台的本地表示中显示路径。静态toNativeSeparators()函数返回指定路径的副本,其中每个目录分隔符都由底层操作系统的适当分隔符替换。

三.全部函数说明

成员函数

返回值函数说明
QDir(const std::filesystem::path &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(NameIgnoreCase), QDir::Filters filters = AllEntries)
QDir(const std::filesystem::path &path)构造函数
QDir(const QString &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(NameIgnoreCase), QDir::Filters filters = AllEntries)
QDir(const QString &path = QString())构造函数
QDir(const QDir &dir)构造函数
QStringabsoluteFilePath(const QString &fileName) const返回目录中文件的绝对路径名。不检查文件是否实际存在于目录中;不会删除fileName中的冗余多个分隔符或".“和”…"目录
QStringabsolutePath() const返回绝对路径(以“/”或驱动器规范开头的路径),该路径可能包含符号链接,但绝不包含冗余的".“、”…"或多个分隔符。
QStringcanonicalPath() const返回规范路径,即没有符号链接或冗余".“或”…"元素的路径
boolcd(const QString &dirName)QDir的目录更改为dirName
boolcdUp()通过从QDir的当前目录上移一个目录来更改目录
uintcount() const返回目录中目录和文件的总数
QStringdirName() const返回目录的名称
QFileInfoListentryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const返回目录中所有文件和目录的QFileInfo对象列表,根据之前使用setNameFilters()和setFilter()设置的名称和属性筛选器排序,并根据使用 setSorting()设置设置的标志排序
QFileInfoListentryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const上一个函数的重载函数
QStringListentryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const返回目录中所有文件和目录的名称列表,根据之前使用setNameFilters()和setFilter()设置的名称和属性筛选器排序,并根据使用 setSorting()设置设置的标志排序
QStringListentryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const上一个函数的重载函数
boolexists(const QString &name) const如果名为name的文件存在,则返回true;否则返回false
boolexists() const上一个函数的重载函数
QStringfilePath(const QString &fileName) const返回目录中文件的路径名。不检查文件是否实际存在于目录中。如果QDir是相对的,则返回的路径名也将是相对的。不会删除fileName中的冗余多个分隔符或".“和”…"目录
std::filesystem::pathfilesystemAbsolutePath() constabsolutePath()返回为std::filesystem::path
std::filesystem::pathfilesystemCanonicalPath() constcanonicalPath()返回为std::filesystem::path
std::filesystem::pathfilesystemPath() constpath()返回为std::filesystem::path
QDir::Filtersfilter() const返回setFilter()设置的值
boolisAbsolute() const如果目录的路径是绝对路径,则返回true;否则返回false
boolisEmpty(QDir::Filters filters = Filters(AllEntriesNoDotAndDotDot)) const
boolisReadable() const如果目录可读并且我们可以按名称打开文件,则返回true;否则返回false
boolisRelative() const如果目录路径是相对的,则返回true;否则返回false。(在Unix下,如果路径不以"/"开头,则路径是相对的)
boolisRoot() const如果目录是根目录,则返回true;否则返回false
boolmakeAbsolute()将目录路径转换为绝对路径。如果它已经是绝对的,什么都不会发生。如果转换成功,则返回true;否则返回false
boolmkdir(const QString &dirName) const创建名为dirName的子目录,成功时返回true;否则返回false。如果调用此函数时目录已存在,则返回false
boolmkpath(const QString &dirPath) const创建目录路径dirPath。该函数将创建创建目录所需的所有父目录。如果成功,则返回true;否则返回false。如果调用此函数时路径已存在,则返回true
QStringListnameFilters() const返回 setNameFilters()设置的字符串列表
QStringpath() const返回路径。这可能包含符号链接,但绝不包含多余的".“、”…"或多个分隔符
voidrefresh() const刷新目录信息
QStringrelativeFilePath(const QString &fileName) const返回相对于目录的fileName路径
boolremove(const QString &fileName)删除文件fileName
boolremoveRecursively()删除目录,包括其所有内容
boolrename(const QString &oldName, const QString &newName)将文件或目录从oldName重命名为newName,如果成功则返回true;否则返回false
boolrmdir(const QString &dirName) const删除dirName指定的目录,目录必须为空,rmdir()才能成功
boolrmpath(const QString &dirPath) const删除目录路径dirPath,该函数将删除dirPath中的所有父目录,前提是它们为空。这与mkpath(dirPath)相反。
voidsetFilter(QDir::Filters filters)entryList()和 entryInfoList()使用的筛选器设置为筛选器。过滤器用于指定entryList()和entryInfoList()应返回的文件类型。
voidsetNameFilters(const QStringList &nameFilters)entryList()和 entryInfoList()使用的名称筛选器设置为nameFilters指定的筛选器列表。
voidsetPath(const QString &path)将目录的路径设置为路径。清除路径中的冗余".“、”…"和多个分隔符。不检查具有此路径的目录是否实际存在;
voidsetPath(const std::filesystem::path &path)上一个函数的重载函数
voidsetSorting(QDir::SortFlags sort)设置entryList()和 entryInfoList()使用的排序顺序
QDir::SortFlagssorting() const返回 setSorting()设置的值
voidswap(QDir &other)将此QDir实例与其他实例交换

静态函数

返回值函数原型说明
voidaddSearchPath(const QString &prefix, const QString &path)将路径添加到前缀的搜索路径
voidaddSearchPath(const QString &prefix, const std::filesystem::path &path)将路径添加到前缀的搜索路径
QStringcleanPath(const QString &path)返回标准化目录分隔符(即,平台本机分隔符转换为"/“)并删除冗余分隔符的路径,并尽可能解析”.“s和”…"s
QDircurrent()返回应用程序的当前目录
QStringcurrentPath()返回应用程序当前目录的绝对路径。当前目录是用QDir::setCurrent()设置的最后一个目录,如果从未调用过,则是父进程启动此应用程序的目录
QFileInfoListdrives()返回此系统上根目录的列表
QStringfromNativeSeparators(const QString &pathName)使用"/“作为文件分隔符返回pathName。例如,在Windows上,fromNativeSeparators(“c:\winnt\system32”)返回"c:\winnt/system32”
QDirhome()返回用户的主目录
QStringhomePath()返回用户主目录的绝对路径
boolisAbsolutePath(const QString &path)如果路径是绝对路径,则返回true;如果是相对的,则返回false
boolisRelativePath(const QString &path)如果路径是相对的,则返回true;如果是绝对值,则返回false
QCharlistSeparator()返回本机路径列表分隔符:Unix下的":“和Windows下”;"
boolmatch(const QString &filter, const QString &fileName)如果fileName与通配符(glob)模式筛选器匹配,则返回true;否则返回false。过滤器可以包含由空格或分号分隔的多个模式。匹配不区分大小写
boolmatch(const QStringList &filters, const QString &fileName)上面函数的重载函数
QDirroot()返回根目录
QStringrootPath()返回根目录的绝对路径,对于Unix操作系统,返回"/“。对于Windows文件系统,通常返回"c:/”
QStringListsearchPaths(const QString &prefix)返回前缀的搜索路径
QCharseparator()返回本机目录分隔符:Unix下为"/“,Windows下为”"
boolsetCurrent(const QString &path)将应用程序的当前工作目录设置为路径。如果目录已成功更改,则返回true;否则返回false。
voidsetSearchPaths(const QString &prefix, const QStringList &searchPaths)使用searchPaths的前缀前缀设置或替换Qt的文件名搜索路径
QDirtemp()返回系统的临时目录
QStringtempPath()返回系统临时目录的绝对规范路径
QStringtoNativeSeparators(const QString &pathName)返回pathName,其中"/“分隔符转换为适用于基础操作系统的分隔符。
在Windows上,to NativeSeparators(“c:\winnt/system32”)返回"c:\wint\system32”
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/652787
推荐阅读
相关标签
  

闽ICP备14008679号