zoukankan      html  css  js  c++  java
  • 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对象:

    img

    示例程序如下:

    #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,目录仍然会被放在前面,但是按照反向的顺序,文件仍然排在目录后面,当然也是按照反向的顺序。



    参考:

    58 QT读取和写入文件

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


  • 相关阅读:
    qemu-img 整理
    学习 Spring (七) Resource
    学习 Spring (七) Resource
    ASP.NET 文件上传类 简单好用
    IOS之UIStepper控件详解
    IOS颜色块设置
    IOS之GCD记录
    ios项目中引用其他开源项目
    IOS之pageControl
    UI常用字体定义和继承的实例,ResearchKitCode
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11044933.html
Copyright © 2011-2022 走看看