二十八、目录操作

二十八、目录操作 QDir

简单的QDir小例子

#include <QCoreApplication>
#include <QDir>
#include <QStringList>
#include <QDebug>

// 定义一个函数,输入一个目录路径,返回该目录及其子目录中所有文件的大小
qint64 getDirFileInfoSizeFunc(const QString &qpath)
{
    // 创建一个QDir对象,用于操作目录
    QDir dir(qpath);
    // 初始化大小为0
    qint64 size = 0;

    // 遍历目录中的所有文件
    foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
    {
        // 将每个文件的大小累加到size
        size = size + fileInfo.size();
    }

    // 遍历目录中的所有子目录
    foreach(QString strDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
    {
        // 对每个子目录递归调用getDirFileInfoSizeFunc函数,并将结果累加到size
        size = size + getDirFileInfoSizeFunc(qpath + QDir::separator() + strDir);
    }

    // 定义一个字符变量用于存储单位('B'代表字节,'K'代表千字节,'M'代表兆字节,'G'代表吉字节)
    char uint = 'B';

    // 计算并存储当前目录的大小(以适当的单位表示)
    qint64 currentDirSize = size;
    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()函数打印目录大小和路径(注意:此功能可能仅在调试版本中可用)
    qDebug() << "目录占据空间为:" << currentDirSize << "\t" << qPrintable(qpath);

    // 返回目录大小(以字节为单位)
    return size;
}

int main(int argc, char *argv[])
{
    // 创建一个QCoreApplication对象,这是Qt的核心部分,用于处理事件循环等操作
    QCoreApplication a(argc, argv);

    // 定义一个QString变量,用于存储当前路径(即当前目录的路径)
    QString strPath;
    // 使用QDir::currentPath()函数获取当前路径,并存储到strPath变量中
    strPath = QDir::currentPath();
    // 使用qDebug()函数打印当前路径(注意:此功能可能仅在调试版本中可用)
    qDebug() << "当前目录为:" << strPath << endl;
    // 调用getDirFileInfoSizeFunc函数,并传入当前路径作为参数,
    //打印出当前目录及其子目录的大小信息(以适当的单位表示)
    getDirFileInfoSizeFunc(strPath);

    // 进入事件循环,等待事件处理(例如用户输入等)并返回退出码(0表示正常退出)
    return a.exec();
}

这段代码的主要目的是获取指定目录及其子目录中所有文件的大小,并以适当的单位(如字节、千字节、兆字节、吉字节)显示出来。

代码流程如下:

  1. getDirFileInfoSizeFunc函数中,首先创建一个QDir对象,用于操作目录。然后初始化大小为0。
  2. 遍历目录中的所有文件,并将每个文件的大小累加到size变量。
  3. 遍历目录中的所有子目录,并对每个子目录递归调用getDirFileInfoSizeFunc函数,将结果累加到size变量。
  4. 根据文件大小,计算出以适当单位表示的目录大小。这里使用了一些基本的数学计算,包括除法和比较。
  5. 使用qDebug()函数打印目录大小和路径(注意:此功能可能仅在调试版本中可用)。
  6. 返回目录大小(以字节为单位)。

main函数中,首先创建了一个QCoreApplication对象,这是Qt的核心部分,用于处理事件循环等操作。然后获取当前路径,并存储到strPath变量中。接着调用getDirFileInfoSizeFunc函数,传入当前路径作为参数,打印出当前目录及其子目录的大小信息(以适当的单位表示)。最后进入事件循环,等待事件处理并返回退出码

QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:

返回目录中所有文件和目录的QFileInfo对象列表,根据先前使用setNameFilters()和setFilter()设置的名称和属性过滤器排序,并根据setSorting()设置的标志排序。
可以使用nameFilters、filters和sort参数覆盖名称筛选器、文件属性筛选器和排序规范。
如果目录不可读、不存在或没有任何内容与规范匹配,则返回空列表。

Filters 

QChar QDir::separator():

返回本机目录分隔符:Unix下为"/",Windows下为"\"。
您不需要使用此函数来构建文件路径。如果你总是使用“/”,Qt会翻译你的路径以符合底层操作系统。如果您希望使用用户操作系统的分隔符显示路径,请使用toNativeSeparators()。

综合例子

dialog.h

// 如果没有定义名为DIALOG_H的头文件,则定义它
#ifndef DIALOG_H
#define DIALOG_H

// 引入QDialog类,使得我们可以使用QDialog的功能
#include <QDialog>

// 引入QListWidget类,这是一个可以显示列表的控件
#include<QListWidget>
// 引入QListWidgetItem类,这是QListWidget中的每一项
#include<QListWidgetItem>
// 引入QLineEdit类,这是一个文本输入框
#include<QLineEdit>
// 引入QDir类,这是一个用于操作目录的类
#include<QDir>
// 引入QFileInfoList类,这是一个用于存储文件信息列表的类
#include<QFileInfoList>
// 引入QVBoxLayout类,这是一个垂直布局管理器
#include<QVBoxLayout>
// 引入QStringList类,这是一个用于存储字符串列表的类
#include<QStringList>

// 引入Qt的命名空间,这样我们就可以直接使用Qt库中的类而不需要加前缀Qt
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }  // 声明一个名为Dialog的类,这个类在Qt Designer中定义了UI界面
QT_END_NAMESPACE

// 定义一个名为Dialog的类,这个类继承自QDialog
class Dialog : public QDialog
{
    Q_OBJECT  // 使用Qt的宏,表示这个类支持Qt的信号和槽机制

public:
    // 构造函数,接受一个QWidget类型的父对象指针作为参数,初始化为nullptr
    Dialog(QWidget *parent = nullptr);
    // 析构函数
    ~Dialog();

    // 定义一个方法dispFileInfoList,接受一个QFileInfoList类型的参数list,用于显示文件信息列表
    void dispFileInfoList(QFileInfoList list);

private:
    // 声明一个指向Ui命名空间下的Dialog类的指针ui,用于访问UI界面元素
    Ui::Dialog *ui;

    // 声明一个QLineEdit类型的指针fileLineEdit,可能用于输入文件名或路径
    QLineEdit *fileLineEdit;
    // 声明一个QListWidget类型的指针fileListWidget,可能用于显示文件列表
    QListWidget *fileListWidget;
    // 声明一个QVBoxLayout类型的指针vbl,可能用于布局管理
    QVBoxLayout *vbl;

public slots:  // 定义public槽函数,这些槽函数可以响应Qt的信号事件
    // 定义一个名为dispDir的槽函数,接受一个QDir类型的参数dir,可能用于显示目录信息或进行目录操作
    void dispDir(QDir dir);
    // 定义一个名为dispDirShow的槽函数,接受一个QListWidgetItem类型的参数item,可能用于在文件列表中选择项目时的操作
    void dispDirShow(QListWidgetItem *item);
};  // 类定义结束

#endif // DIALOG_H  // 如果之前没有定义DIALOG_H头文件,则在这里结束定义

dialog.cpp

// 引入"dialog.h"头文件,该文件可能包含了Dialog类的声明和部分实现
#include "dialog.h"
// 引入"ui_dialog.h"头文件,该文件可能包含了与Dialog类相关的UI界面元素
#include "ui_dialog.h"

// Dialog类的构造函数
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)  // 初始化基类QDialog,设置父对象为传入的QWidget指针
    , ui(new Ui::Dialog)  // 初始化ui指针,指向Ui命名空间下的Dialog类对象
{
    ui->setupUi(this);  // 使用ui对象设置UI界面

    resize(500,350);  // 设置对话框的大小为500x350像素

    fileLineEdit=new QLineEdit("/");  // 创建一个文本输入框,初始内容为"/"
    fileListWidget=new QListWidget;  // 创建一个列表控件

    vbl=new QVBoxLayout(this);  // 创建一个垂直布局管理器,并将其设置为对话框的布局
    vbl->addWidget(fileLineEdit);  // 将文本输入框添加到布局中
    vbl->addWidget(fileListWidget);  // 将列表控件添加到布局中

    // 连接文本输入框的returnPressed信号到dispdir(QDir)槽函数
    connect(fileLineEdit,SIGNAL(returnPressed()),this,SLOT(dispdir(QDir)));
    // 连接列表控件的itemDoubleClicked信号到dispDirShow(QListWidgetItem *)槽函数
    connect(fileListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem *)),this,SLOT(dispDirShow(QListWidgetItem *)));

    QString root="/";  // 设置根目录为"/"
    QDir rootDir(root);  // 创建一个QDir对象,表示根目录
    QStringList strList;  // 创建一个字符串列表
    strList<<"*";  // 向列表中添加一个通配符"*"

    QFileInfoList list=rootDir.entryInfoList(strList);  // 获取根目录下的文件和目录列表

    dispFileInfoList(list);  // 显示文件和目录列表
}

// Dialog类的析构函数
Dialog::~Dialog()
{
    delete ui;  // 删除ui指针指向的对象,释放内存
}

// 显示文件和目录列表的函数
void Dialog::dispFileInfoList(QFileInfoList list)
{
    fileListWidget->clear();  // 清空列表控件的内容

    for(unsigned int i=0;i<list.count();i++)  // 遍历文件和目录列表
    {
        QFileInfo tempFileInfo=list.at(i);  // 获取当前项的文件信息

        if(tempFileInfo.isDir())  // 如果当前项是一个目录
        {
            QIcon ico("D:/dir.jpg");  // 创建一个图标对象,指向目录图片文件"D:/dir.jpg"
            QString fileName=tempFileInfo.fileName();  // 获取目录的名称
            QListWidgetItem *temp=new QListWidgetItem(ico,fileName);  // 创建一个列表控件项,设置图标和名称
            fileListWidget->addItem(temp);  // 将新项添加到列表控件中
        }
        else if(tempFileInfo.isFile())  // 如果当前项是一个文件
        {
            QIcon ico("D:/file.jpg");  // 创建一个图标对象,指向文件图片文件"D:/file.jpg"
            QString fileName=tempFileInfo.fileName();  // 获取文件的名称
            QListWidgetItem *temp=new QListWidgetItem(ico,fileName);  // 创建一个列表控件项,设置图标和名称
            fileListWidget->addItem(temp);  // 将新项添加到列表控件中
        }
    }
}

// Dialog类的dispDir函数,用于显示目录内容
void Dialog::dispDir(QDir dir)
{
    // 创建一个QStringList,并添加一个通配符"*"
    QStringList list;
    list << "*";

    // 从给定的目录中获取所有条目信息,包括文件和子目录,按名称排序,且优先显示目录
    QFileInfoList fileInfo = dir.entryInfoList(list, QDir::AllEntries, QDir::DirsFirst);

    // 调用dispFileInfoList函数,显示文件信息列表
    dispFileInfoList(fileInfo);
}

// Dialog类的dispDirShow函数,用于根据选择的列表项显示目录内容
void Dialog::dispDirShow(QListWidgetItem *item)
{
    // 创建一个QDir对象
    QDir dir;

    // 获取选择的列表项的文本
    QString str = item->text();

    // 设置QDir对象的路径为fileLineEdit文本框的内容
    dir.setPath(fileLineEdit->text());

    // 进入由列表项文本指定的子目录
    dir.cd(str);

    // 将fileLineEdit文本框的内容设置为当前目录的绝对路径
    fileLineEdit->setText(dir.absolutePath());

    // 调用dispDir函数,显示当前目录的内容
    dispDir(dir);
}

这段代码是使用C++和Qt库编写的,主要目的是创建一个对话框(Dialog),用于显示一个目录下的文件和子目录列表。下面是代码的详细解释:

  1. 引入所需的头文件:

    • #include "dialog.h":引入dialog.h头文件,该文件可能包含了Dialog类的声明和部分实现。
    • #include "ui_dialog.h":引入ui_dialog.h头文件,该文件可能包含了与Dialog类相关的UI界面元素。
  2. 定义Dialog类的构造函数:

    • Dialog::Dialog(QWidget *parent):构造函数,初始化Dialog对象。
      • ui->setupUi(this);:使用ui对象设置UI界面。
      • resize(500,350);:设置对话框的大小为500x350像素。
      • 创建文本输入框(文件路径输入框)和列表控件。
      • 创建垂直布局管理器,并将文本输入框和列表控件添加到布局中。
      • 连接文本输入框的returnPressed()信号到dispdir(QDir)槽函数。
      • 连接列表控件的itemDoubleClicked(QListWidgetItem *)信号到dispDirShow(QListWidgetItem *)槽函数。
      • 设置根目录为"/",并获取根目录下的文件和目录列表。
      • 显示文件和目录列表。
  3. 定义Dialog类的析构函数:

    • Dialog::~Dialog():析构函数,删除ui指针指向的对象,释放内存。
  4. 定义显示文件和目录列表的函数:

    • void Dialog::dispFileInfoList(QFileInfoList list):遍历文件和目录列表,并显示在列表控件中。
  5. 定义dispDir函数,用于显示目录内容:

    • void Dialog::dispDir(QDir dir):从给定的目录中获取所有条目信息,并调用dispFileInfoList函数显示文件信息列表。
  6. 定义dispDirShow函数,用于根据选择的列表项显示目录内容:

    • void Dialog::dispDirShow(QListWidgetItem *item):根据选择的列表项的文本,进入指定的子目录,并调用dispDir函数显示当前目录的内容。

这段代码的主要功能是创建一个文件和目录浏览对话框,用户可以通过输入框输入目录路径,然后浏览该目录下的文件和子目录,并在列表控件中选择子目录以进一步浏览。

void QLineEdit::returnPressed():

这个信号在按下回车键时发出。注意,如果在行编辑上设置了validator()或inputMask(),则只有当输入遵循inputMask()并且validator()返回QValidator::Acceptable时才会发出returnPressed()信号。

 void QListWidget::itemDoubleClicked(QListWidgetItem *item):

当在小部件中的一个项目上双击鼠标按钮时,该信号与指定的项目一起发出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/252766.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.3数据通路的功能和基本结构

数据通路的基本结构: 1.CPU内部单总线方式。 2.CPU内部多总线方式。 3.专用数据通路方式。 内部总线是指同一部件&#xff0c;如CPU内部连接各寄存器及运算部件之间的总线; 系统总线是指同一台计算机系统的各部件&#xff0c;如CPU、内存、通道和各类I/O接口间互相连接的总线。…

[强网杯2023] 只作了几个小题

感觉现在比赛越来越难了&#xff0c;只作了几个小题&#xff0c;赛后把看到的wp复现到的也一并记录一下。 misc/fuzz 这就是个猜数的题&#xff0c;哪个数字对了就在哪一位上显示1一共9位&#xff0c;不过服务器返回的前两个并不一定正确&#xff0c;多试几把。 Enter a stri…

Vue 项目关于在生产环境下调试

前言 开发项目时&#xff0c;在本地调试没问题&#xff0c;但是部署到生产会遇到一些很奇怪的问题&#xff0c;本地又没法调&#xff0c;就需要在生产环境/域名下进行调试。 在这里介绍一个插件Vue force dev ,浏览器扩展里下载 即便是设置了Vue.config.devtoolsfalse 只要安…

【数据结构】复习题(一)

一、选择题 1.组成数据的基本单位是()。 A. 数据项 B.数据类型 C.数据元素 D.数据变量 2.设数据结构A{D,R},其中D&#xff5b;1,2,3,4},R{r},r{<1,2>,<2,3>,< 3,4>,<4,1>}&#xff0c;则数据结构A是()。 A.线性结构 B.树型结构 C.图型结构 D.集合 3.…

计算机网络网络层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 路由算法静态路由与动态路由距离-向量算法链路状态路由算法层次路由 IPv4&#xff08;这个必考&#xff09;IPv4分组IPv4地址与NAT子网划分与子网掩码、CIDRARP、DHCP与ICMP地址解析协议ARP动态主机配置协议DHCP IPv6IPv6特点 路由协议…

山西电力市场日前价格预测【2023-12-16】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-16&#xff09;山西电力市场全天平均日前电价为259.00元/MWh。其中&#xff0c;最高日前电价为333.74元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

alibaba druid连接池

alibaba druid连接池 如果是SpringBoot 3.x&#xff0c;使用以下依赖 com.alibaba druid-spring-boot-3-starter ${druid-spring-boot-starter.version} application.yml配置 登录页面配置 切面监控springboot类 对 Web 请求的监控 配置filter&#xff0c;收集统计信息&#x…

深度剖析JavaScript中冒泡和捕获机制、事件代理

JS事件传播的两种机制包括冒泡和捕获&#xff0c;下面将具体剖析它们之间本质的区别。 事件冒泡: 先触发子元素的事件&#xff0c;再触发父元素的事件。 创建一个 ul label 和 li label, 分别绑定一个父id 和 子 id, 再通过创建 script&#xff0c;去绑定各自的点击事件。 <…

【C++】封装:练习案例-设计立方体类

练习案例&#xff1a;设计立方体类 设计立方体类(Cube) 求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等。 思路&#xff1a; 1&#xff09;创建立方体类 2&#xff09;设计属性 长&#xff0c;高&#xff0c;宽 3&#xff09;设计行为 获取立方…

配置 vim 默认显示行号 行数 :set number

vi ~/.vimrc 最后添加一行 :set number保存退出&#xff0c;再次 vim 打开文件&#xff0c;默认就会显示行号了

SpringBoot - application.yml 多环境切换解决方案

问题描述 这个问题玩过 SpringCloud 的小伙伴估计会想到用 bootstrap.yml 来解决这个问题。但是如果说为了解决这个问题引入了一堆的 SpringCloud Jar&#xff0c;就感觉杀鸡用牛刀。 于是今天我们想只有 application.yml 自己就可以解决这个问题&#xff0c;如何搞定&#x…

vue中2种取值的方式

1.url是这种方式的&#xff1a;http://localhost:3000/user/1 取得参数的方式为&#xff1a;this.$route.params.id 2.url为get方式用&#xff1f;拼接参数的&#xff1a;http://localhost:3000/user?phone131121123&companyId2ahttp://localhost:3000/ 取得参数值的方式…

linux脚本中 #!/bin/sh、#!/bin/bash

我们通常看到的脚本文件总是有以下这样的开头&#xff1a; #!/bin/bash本文解释一下这是什么&#xff0c;以及为什么要写它。 首先解释一下 #! &#xff0c;因为 #!有个专有的名词&#xff0c;叫 shebang 发音类似中文的 “蛇棒” 。为什么叫 shebang 呢&#xff1f; 首先 #…

连锁管理系统是什么?有哪些功能?

连锁管理系统帮助门店实现POS收银管理、门店管理、采购订货管理、线上商城搭建、供应链管理一体化管理系统&#xff0c;快速提高门店管理效率&#xff0c;无论你的门店有多少&#xff0c;连锁总部都能通过系统随时洞察监管门店的所有运营数据。 连锁管理系统由&#xff1a;1个…

Web安全漏洞分析—文件包含

在当今数字化时代&#xff0c;随着Web应用程序的广泛应用&#xff0c;网络安全问题愈加凸显。其中&#xff0c;文件包含漏洞作为一种常见但危险的安全隐患&#xff0c;为恶意攻击者提供了可乘之机。在这篇博客中&#xff0c;我们将深入探讨文件包含漏洞的本质、攻击手法以及应对…

visio打出根号,下标,并调整符号的大小

插入公式对象 打出根号和带下标的字母 调整符号大小 把做好的公式符号弄到visio中的图中 ctrla 复制符号 进入visio中粘贴 并 调整大小 调整大小直接拖动边框上的圆点即可。

【数据结构】八大排序之希尔排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.优化直接插入排序算法 我们在之前对直接插入排序算法的优化部分通过对直接插入排序的分析可以得到一个结论,即: 进行直接插入排序的数组,如果越接近局部有序,则后续进行直…

软件设计师——计算机组成原理(三)

&#x1f4d1;前言 本文主要是【计算机组成原理】——软件设计师——计算机组成原理的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

计算机网络:运输层

0 本节主要内容 问题描述 解决思路 1 问题描述 1.1 知识回顾 利用如下拓扑对前面的知识进行回顾。 图1 拓扑图 问题&#xff1a;源主机 H 1 \textrm{H}_1 H1​要和目的主机 H 2 \textrm{H}_2 H2​进行通信&#xff0c;源主机 H 1 \textrm{H}_1 H1​要构建数据包封装来自应…

SQL进阶理论篇(九):为什么不存在完美的索引

文章目录 简介索引片和过滤因子如何通过宽表避免回表什么是过滤因子理想索引设计&#xff1a;三星索引为什么很难存在理想的索引设计&#xff1f;参考文献 简介 本节将主要介绍以下部分&#xff1a; 什么是索引片&#xff0c;什么是过滤因子&#xff1f;设计索引的时候&#…
最新文章