qt 目录操作(QDir 类)展示系统文件案例

2023-11-18

1.目录操作 QDir 类

QDir类提供对目录结构及其内容的访问。QDir用于操作路径名,访问有关路径和文件的信息以及底层文件系统。它还可以用于访问Qt的资源系统。 

Qt使用 “ / ” 作为通用目录分隔符,与 “ / ” 在URL中作用路径分隔符的方式相同。如果你总是使用   “ / ” 作为目录分隔符,Qt将转换您的路径以符合底层操作系统。

QDir可以使用相对路径或绝对路径指向文件。绝对路径以目录分隔符开头(在windows下,可以选自驱动器规格开头)。相对文件名以目录名或 文件名开头,并指定相对当前的路径。

QDir是Qt Framework提供的一个目录操作类,用于对文件系统中的目录进行访问和操作。它可以列出目录中的文件和子目录,创建新的目录和文件,删除目录和文件,检查文件或目录是否存在,以及修改文件名等。

QDir的主要功能:

  1. 构造函数:通过不同参数的组合来创建QDir对象,可以指定路径、过滤器、排序规则等信息。

  2. 目录遍历:通过entryList()函数获取目录中的文件列表和子目录列表,也可以通过QDirIterator迭代器来实现遍历。

  3. 创建和删除目录:使用mkdir()函数创建新的目录,使用rmdir()函数删除已有的目录。

  4. 文件操作:使用QFile类进行文件读写操作,可以通过QFile::copy、QFile::rename、QFile::remove等函数实现文件操作。

  5. 文件过滤和排序:通过设置过滤器和排序规则来筛选和排序目录中的文件和子目录。

  6. 其他功能:判断文件或目录是否存在、获取目录的绝对路径、设置当前目录等。

QFileInfo

用于获取文件或目录的元信息,如文件名、路径、大小、创建时间、访问时间、修改时间等。可以通过该类提供的函数对文件或目录进行判断,例如判断文件是否存在、是否是隐藏文件、是否是符号链接等。

  • 获取文件名和路径

可以使用fileName()函数获取文件名,absoluteFilePath()函数获取绝对路径,和absolutePath()函数获取文件所在目录的绝对路径。

QFileInfo fileInfo("/path/to/file.txt");
qDebug() << fileInfo.fileName(); // 输出 "file.txt" 
qDebug() << fileInfo.absoluteFilePath(); // 输出 "/path/to/file.txt" 
qDebug() << fileInfo.absolutePath(); // 输出 "/path/to"
  • 断文件是否存在

可以使用exists()函数判断文件是否存在。

QFileInfo fileInfo("/path/to/nonexistent/file.txt");
 if (fileInfo.exists()) 
{ qDebug() << "File exists"; 
} else { 
qDebug() << "File does not exist"; 
}
  • 判断文件类型

可以使用isFile()函数判断文件是否是普通文件,isDir()函数判断文件是否是目录,isSymLink()函数判断文件是否是符号链接等。

QFileInfo fileInfo("/path/to/directory");
 if (fileInfo.isFile()) { 

qDebug() << "This is a file";
 } else if (fileInfo.isDir()) {
 qDebug() << "This is a directory"; 
} else if (fileInfo.isSymLink()) {
 qDebug() << "This is a symbolic link";
 }
  • 获取文件大小

可以使用size()函数获取文件大小(单位为字节)。

QFileInfo fileInfo("/path/to/file.txt"); 
qDebug() << "File size:" << fileInfo.size() << "bytes";
  • 获取文件时间信息

可以使用created()函数获取文件创建时间,lastModified()函数获取文件最后修改时间,和lastRead()函数获取文件最后访问时间。

QFileInfo fileInfo("/path/to/file.txt"); 
qDebug() << "File created:" << fileInfo.created().toString("yyyy-MM-dd hh:mm:ss"); 
qDebug() << "File last modified:" << fileInfo.lastModified().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "File last read:" << fileInfo.lastRead().toString("yyyy-MM-dd hh:mm:ss");

QFileInfoList

QFileInfoList是一个用于存储QFileInfo对象的列表类。QFileInfoList可以使用QDir类中的entryInfoList()或entryInfoList()函数获取当前目录下文件或子目录的信息,并将这些信息作为QFileInfo对象添加到QFileInfoList中。QFileInfoList可以方便地对文件和目录进行遍历、过滤和排序等操作。

举例1:获取当前路径下目录下的文件和文件大小

效果:

#include <QCoreApplication>
#include <QDir>
#include <QtDebug>

//自定义函数实现获取目录大小
qint64 GetDirFileInfoSizeFunc(const QString &qpath)
{
    //QDir类专门用来操作路径名称或底层文件系统,可以使用相对路径和绝对路径来指向一个文件/目录
    QDir qdirs(qpath);


    qint64 qsize=0;//存放目录占据空间
    //QFileInfo 用于获取文件和目录的相关信息,例如文件名、路径、大小、修改时间等。
    //可以通过QFileInfo构造函数传入文件或目录的路径来创建一个QFileInfo对象,然后调用其成员函数获取相应的信息。
    //ententryInfoList(QDir::Files) 是 QDir 类中的一个函数,用于获取指定目录下的文件列表。
    //其中,QDir::Files 参数表示只列出当前目录下的文件,不包括子目录。
    foreach(QFileInfo finfo,qdirs.entryInfoList(QDir::Files))
    {
        qsize=qsize+finfo.size();
    }
    //QDir::Dirs列出所以子目录。
    //QDir::NoDotAndDotDot不列出文件系统中的特殊文件,表示在文件夹中不包含"."和".."两个特殊目录。这通常用于过滤掉当前目录和上级目录。
    //将每个子目录的路径名作为QString类型的参数sDir传递给循环体中的代码块。
    foreach(QString sDir,qdirs.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
    {
        //QDir::separator()是一个静态函数,返回操作系统使用的路径分隔符。在Windows上,
        //它返回反斜杠“\”,在Unix/Linux上,它返回正斜杠“/”。
        qsize=qsize+GetDirFileInfoSizeFunc(qpath+QDir::separator()+sDir);
    }

    char uint='B';
    qint64 currentdirsize=qsize;
    if(currentdirsize>1024){
        currentdirsize =currentdirsize/1024;
        uint='K';
        if(currentdirsize>1024){
            currentdirsize =currentdirsize/1024;
            uint='M';
            if(currentdirsize>1024){
                currentdirsize =currentdirsize/1024;
                uint='G';
                if(currentdirsize>1024){
                    currentdirsize =currentdirsize/1024;
                    uint='T';

                }
            }
        }
    }
    qDebug()<<"目录占据空间为:"<<currentdirsize<<"\t"<<qPrintable(qpath);
    return qsize;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //该字符串存放路径
    QString strpath;
    strpath=QDir::currentPath();//获取当前目录
    qDebug()<<"当前目录为:"<<qPrintable(strpath);

    //调用此函数求占据空间的大小
    GetDirFileInfoSizeFunc(strpath);

    return a.exec();
}

举例2:打开文件并显示路径的小案例

效果:

 

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

#include <QListWidget> //列表框
#include <QListWidgetItem> //用于表示列表框中的列表项
#include <QLineEdit> //单行文本框

#include <QDir>//获取操作路径及底层文件系统
#include <QFileInfoList> //获取指定目录的基本信息
/*QFileInfoList用于存储QFileInfo对象的列表。每个QFileInfo对象包含有关文件或目录的元数据,
 * 例如路径,大小,修改日期和访问权限等信息。QFileInfoList通常用于获取目录中所有文件或子目录的元数据列表,
 * 并执行各种操作,例如复制,移动,删除或重命名文件。*/

#include <QVBoxLayout> //垂直布局
#include <QStringList>


class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

    QLineEdit *filelineedit;//显示所选择目录名称
    QListWidget *fileListWidget;//列表框:展示目录和文件
    QVBoxLayout *qvlayout;//垂直布局

    void dispfileinfolist(QFileInfoList list);//显示目录文件所对应图标
private slots:
    void dispdir(QDir dir); //
    void disdirshow(QListWidgetItem *item);  //


};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <QDebug>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{

    resize(500,300);
    setWindowTitle("QDir综合应用测试");

    filelineedit=new QLineEdit("/");
    fileListWidget=new QListWidget;

    qvlayout=new QVBoxLayout(this);
    qvlayout->addWidget(filelineedit);
    qvlayout->addWidget(fileListWidget);

    QString root="/"; //根目录  此程序在d盘下 所以根目录为d盘目录  可改其他路径 如c:/ e:/
    QDir rootDir(root);
    QStringList strlist;
    strlist<<"*"; //所有文件
    //获取根目录下所有文件和子目录的信息放入到list中
    QFileInfoList list =rootDir.entryInfoList(strlist);

    //调用此函数来显示
    dispfileinfolist(list);

    connect(fileListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem *)),this,SLOT(disdirshow(QListWidgetItem *)));
}

Dialog::~Dialog()
{
}
void Dialog::dispfileinfolist(QFileInfoList list)//显示目录文件所对应图标
{
    fileListWidget->clear(); //先清空列表视图
    for (int i = 0;i<list.count();i++) {
        QFileInfo tempfileinfo=list[i]; //获取listinfo中的info

        if(tempfileinfo.isDir()) //判断是目录
        {
            QIcon ioc("d:/dir.jpg"); //用于表示图标
            QString filename=tempfileinfo.fileName();//获取文件名
            //创建一个列表项并设置图标和名字
            QListWidgetItem *temp=new QListWidgetItem(ioc,filename);
            fileListWidget->addItem(temp);//添加项到列表中
        }else if(tempfileinfo.isFile()) //判断是文件
        {
            QIcon ioc("d:/file.jpg"); //用于表示图标
            QString filename=tempfileinfo.fileName();//获取文件名
            //创建一个列表项并设置图标和名字
            QListWidgetItem *temp=new QListWidgetItem(ioc,filename);
            fileListWidget->addItem(temp);//添加项到列表中
        }
    }
}
void Dialog::dispdir(QDir dir)  //在列表控件中显示当前目录下的文件和子目录
{
    QStringList strlist;
    strlist<<"*";//所有文件
    //QDir::AllEntries: 表示获取所有类型的文件和目录信息,包括文件、目录、符号链接等。
    //QDir::DirsFirst: 表示先列出所有子目录,再列出文件,且按字母顺序排序。
    QFileInfoList fileinfolist=dir.entryInfoList(strlist,QDir::AllEntries,QDir::DirsFirst);

    dispfileinfolist(fileinfolist); //调用显示方法将fileinfolist列表显示出来
}
void Dialog::disdirshow(QListWidgetItem *item)  //在文本框中显示当前目录
{
    QDir dir;
    QString str=item->text(); //获取当前双击的item的文件名
    //qDebug()<<str;

    dir.setPath(filelineedit->text());//设置当前的文本路径为dir的路径
    dir.cd(str); //转到文件名为str的路径
    filelineedit->setText(dir.absolutePath());//获取文件或目录的绝对路径并设置到文本框中

    dispdir(dir); //将当先双击选择的路径放入dispdir中显示在列表中
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt 目录操作(QDir 类)展示系统文件案例 的相关文章

  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 如何使 Python、QT 和 Webkit 在无头服务器上工作?

    我有 Debian Linux 服务器 我用它来做各种事情 我希望它能够完成一些我需要定期完成的网络抓取工作 这段代码可以是在这里找到 http bit ly QeqvzX import sys from PyQt4 QtGui impor
  • Qml 和模糊图像

    我想使用 QML 实现模糊效果 我找到了有关 效果 模糊 的参考资料 例子 http qt gitorious org lscunha qt components lscunha qt components blobs d78feec567
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目

随机推荐

  • 【ClickHouse数据库】如何在Win10的Ubuntu上通过ClickHouse存取行情数据

    如何在Win10的Ubuntu上通过ClickHouse存取行情数据 前言 一 ClickHouse是什么 二 如何在Ubuntu上安装ClickHouse 三 添加用户并设置密码 四 使用 1 使用DBeaver操作数据库 2 向Clic
  • 计算机图形学方向和前景&&3D

    我是刚入坑计算机图形学的小菜鸟 在百度上搜索计算机图形学方向和前景和3D 几乎不能搜到什么有用的东西 google还能搜到些有用的 但是需要翻墙 恰好前几天山大承办的games 北京大学陈宝权老师提出了图形学的新疆界 10个左右的国内图形学
  • vue 如何获取input中光标位置,并且点击按钮在当前光标后追加内容

    1 第一步 监听输入框的鼠标失焦事件
  • (原创)c++11中的日期和时间库

    c 11提供了日期时间相关的库chrono 通过chrono相关的库我们可以很方便的处理日期和时间 c 11还提供了字符串的宽窄转换功能 也提供了字符串和数字的相互转换的库 有了这些库提供的便利的工具类 我们能方便的处理日期和时间相关的转换
  • linux服务器管理与维护,linux服务器管理与维护速训..ppt

    linux服务器管理与维护速训 入门级命令 1990年秋天 Linus在芬兰首都赫尔辛基大学学习操作系统课程 因为上机需要排队等待 Linus买了台PC机 开发了第一个程序 程序包括两个进程 分别向屏幕上写字母A和B 然后用定时器来切换进程
  • mysql必考知识_可能是全网最好的MySQL重要知识点 !面试必备

    标题有点标题党的意思 但希望你在看了文章之后不会有这个想法 这篇文章是作者对之前总结的 MySQL 知识点做了完善后的产物 可以用来回顾MySQL基础知识以及备战MySQL常见面试问题 Python资源共享群 484031800 什么是My
  • 在GPU上实现光线跟踪

    include cuda h include book h include cpu bitmap h define DIM 1024 生成图像的大小 DIM DIM define SPHERES 20 生成的图像中球体的个数 define
  • Laplace smoothing in Naïve Bayes algorithm(拉普拉斯平滑)

    在这里转载只是为了让不能够科学搜索的同学们看到好文章而已 个人无收益只是分享知识 顺手做个记录罢了 原网址 https towardsdatascience com laplace smoothing in na C3 AFve bayes
  • 走进计算机的0和1

    一 计算机的产生在历史的长河中 人类发明和创造了许多算法与计算工具 在我国商朝时期就有算珠 春秋战国时期的算表 唐宋时期的算盘 欧洲在16世纪也发明了许多的计算工具 经过一系列的发展 知道1946年一月 世界上第一台计算机诞生 计算机比较笨
  • matlab 神经网络设计多层隐含层_【MATLAB深度学习】多层神经网络

    多层神经网络 对于多层神经网络的训练 delta规则是无效的 因为应用delta规则训练必须要误差 但在隐含层中没有定义 输出节点的误差是指标准输出和神经网络输出之间的差别 但训练数据不提供隐藏层的标准输出 真正的难题在于怎么定义隐藏节点的
  • 【Python】`*args` 和 `**kwargs`的用法【最全详解】

    args 和 kwargs的用法 猛滴打开博客 发现实在有段时间没更新了 又刚好用到了 kwargs 遂想起了许久之前总结的这篇博客 夸张点说也算是自己的一个呕心沥血之作吧 相信不少同学在看大神的程序时 总会看见 args kwargs 这
  • Deep Ensemble Bootstrapped Q-Learning (Deep-EBQL)【代码复现】

    Deep EBQL理论基础 原文链接 Ensemble Bootstrapping for Q Learning Deep EBQL是EBQL的深度学习版本 也即是在DQN的基础上 引入集成的思想 解决DQN过估计的问题 深度版本的EBQL
  • 02-----libevent下载或者移植环境时报错(/usr/bin/ld: warning:xxx,needed by xxx,not found)

    这个问题 bin sh xx 命令 not found是非常常见的 更具体可以是下图的情况 两者是一样的 1 我第一次遇到这种情况时 发现是库版本不对 所以将这些动态库换一篇后解决 ln s usr local lib libevent c
  • VSCode编码特效

    下载插件 Power Mode 然后来到settings json文件进行修改配置 如果找不到 可以只搜索settings 代码中继续追加这部分代码 explorer confirmDelete false powermode enable
  • Es修改索引别名

    在使用ES时有时候我们需要修改索引信息 本文总结了如何修改索引信息 ES修改索引结构 在 ElasticSearch 中索引就类似于关系型数据库中 Table 的概念 如果要修改索引的一些关键信息时 要重建索引 具体步骤如下 新建索引 复制
  • 【HTML】用户名、身份证号、邮箱、验证

    为了使页面不是那么突兀 特地导入了这俩个bootstrap框架相关的包
  • 归纳总结MATLAB中与矩阵运算有关的算术运算符(加、减、乘、除、点乘、点除、乘方、转置等)

    运算是算法的基础 所以我们有必要了解我们使用的工具怎样实现矩阵的基本运算 这篇博文总结MATLAB中矩阵的算术运算符 目录 01 加法运算符 02 减法 相反数 运算符 03 元素乘积 点乘 运算符 04 元素右除 点除 运算符 05 元素
  • C盘爆满如何解决

    上外网找到几个法子 第3个方法和你购买了驱动精灵的C盘瘦身专家的清理系统休眠文件功能是一样的 法1 一种方法是使用Windows系统自带的磁盘清理工具 它可以帮助你删除一些不需要的文件 如临时文件 回收站中的内容 系统还原点等 释放磁盘空间
  • Cesium开发个射击游戏

    经常刷视频看到这类设计游戏 思索cesium能不能开发个这样的游戏 场景就基于遥感影像或者倾斜模型 于是历时3天 水平有限 开发出简易的设计游戏demo 效果视频在b站 源码连接就丢在视频评论区了 用cesium从零开始开发个射击游戏 哔哩
  • qt 目录操作(QDir 类)展示系统文件案例

    1 目录操作 QDir 类 QDir类提供对目录结构及其内容的访问 QDir用于操作路径名 访问有关路径和文件的信息以及底层文件系统 它还可以用于访问Qt的资源系统 Qt使用 作为通用目录分隔符 与 在URL中作用路径分隔符的方式相同 如果