Qt 目录操作(QDir 类)及展示系统文件实战 QFilelnfo 类介绍和获取文件属性项目实战

news2024/11/22 15:24:09

一、目录操作(QDir 类)

QDir 类提供访问系统目录结构

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

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


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

下面是QDir的一些常用方法:

  1. 构造函数:QDir(const QString &path = QString())

  2. 判断路径是否存在:bool exists() const;

  3. 判断是否是文件:bool isFile() const;

  4. 判断是否是文件夹:bool isDir() const;

  5. 获取当前路径:QString absolutePath() const;

  6. 获取文件名:QString fileName() const;

  7. 获取文件目录:QString dirName() const;

  8. 获取文件大小:qint64 size() const;

  9. 获取文件的创建时间:QDateTime created() const;

  10. 获取文件的最后修改时间:QDateTime lastModified() const;

案例分析:

main.cpp

#include <QCoreApplication>

#include <QDir>
#include <QStringList>
#include <QtDebug>


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

    qint64 qsize=0; // 存放目录占据空间

    // QFileInfor类提供有关文件系统当中文件名称、路径(位置)、访问权限、文件类型等等信息
    // entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表
    foreach(QFileInfo finfo,qdirs.entryInfoList(QDir::Files))
    {
        qsize=qsize+finfo.size();
    }

    // QDir::Dirs列出目录。QDir::separator()不列出文件系统当中的特殊文件
    foreach(QString sDir,qdirs.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
    {
        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()<<"当前目录为:"<<strPath<<endl;

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

    return a.exec();
}

编译执行结果:

二、QDir 类综合应用展示系统文件实战操作

展示系统文件如下:

代码示例:

qdirfileviews.h

#ifndef QDIRFILEVIEWS_H
#define QDIRFILEVIEWS_H

#include <QDialog>

#include <QListWidget>  // 列表框
#include <QListWidgetItem>
#include <QLineEdit> // 单行输入框/单行编辑框

#include <QDir> // 获取操作路径及底层文件系统
#include <QFileInfoList> // 获取指定目录的基本数据信息

#include <QVBoxLayout> // 垂直布局

#include <QStringList>


class QDirFileViews : public QDialog
{
    Q_OBJECT

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


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

public:
    void dispfileinfolist(QFileInfoList list); // 显示目录和文件所对应图标

public slots:
    void dispdir(QDir dir);
    void dispdirshow(QListWidgetItem *item);

};
#endif // QDIRFILEVIEWS_H

main.cpp

#include "qdirfileviews.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QDirFileViews w;
    w.show();
    return a.exec();
}

qdirfileviews.cpp

#include "qdirfileviews.h"

QDirFileViews::QDirFileViews(QWidget *parent)
    : QDialog(parent)
{
    resize(500,350);

    setWindowTitle("QDir类综合控件应用测试");

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

    glayout=new QVBoxLayout(this);
    glayout->addWidget(filelineedit);
    glayout->addWidget(filelistwidget);


    // 信号与槽函数连接
    connect(filelineedit,SIGNAL(returnPressed()),this,SLOT(dispdir(QDir)));

    connect(filelistwidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),
            this,SLOT(dispdirshow(QListWidgetItem*)));

    QString root="/";
    QDir rootDir(root);
    QStringList strlist;
    strlist<<"*";

    // entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表
    QFileInfoList list=rootDir.entryInfoList(strlist);

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

}

QDirFileViews::~QDirFileViews()
{
}


void QDirFileViews::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");
            QString filename=tempfileinfo.fileName();
            QListWidgetItem *temp=new QListWidgetItem(ico,filename);
            filelistwidget->addItem(temp);
        }
        else if(tempfileinfo.isFile()) // 判断是文件
        {
            QIcon ico("d:/file.jpg");
            QString filename=tempfileinfo.fileName();
            QListWidgetItem *temp=new QListWidgetItem(ico,filename);
            filelistwidget->addItem(temp);
        }
    }

}

void QDirFileViews::dispdir(QDir dir)
{
    QStringList strlist;
    strlist<<"*";

    QFileInfoList fileinfolist=dir.entryInfoList(strlist,QDir::AllEntries,QDir::DirsFirst);


    dispfileinfolist(fileinfolist);
}

void QDirFileViews::dispdirshow(QListWidgetItem *item)
{
    QDir dir;
    QString str=item->text();

    dir.setPath(filelineedit->text());
    dir.cd(str);

    filelineedit->setText(dir.absolutePath());

    dispdir(dir);
}

三、QFilelnfo 类介绍

QFileInfo是一个类,用于获取关于文件或目录的元信息。它提供了各种方法来检索有关文件或目录的信息,例如文件的大小、创建时间、修改时间、访问权限等。QFileInfo类也可以用于检查文件或目录是否存在,并检索每个文件或目录的绝对路径。

该类的构造函数需要一个文件路径或目录路径参数。可以使用QFile类的fileInfo方法来生成QFileInfo对象,或者使用QDir类的entryInfo或entryInfoList方法来生成QFileInfo对象。QFileInfo还提供了许多其他的方法,例如isFile(),isDir(),isExecutable()等,用于检查文件或目录的类型和属性。

QFileInfo类是Qt中用于文件和目录操作的常用类之一,可用于创建、修改或删除文件和目录,或处理文件和目录的元数据。

四、QFilelnfo 类获取文件属性及相关信息实战

案例分析:实现下面功能

代码示例:

getfileinfo.cpp

#include "getfileinfo.h"

GetFileInfo::GetFileInfo(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("获取文件属性项目实战模块");

    labelfilename=new QLabel("文件路径名称:");
    qlineeditfilename=new QLineEdit;
    qpushbuttongetfilename=new QPushButton("打开文件...");

    labelfilesize=new QLabel("文件容量大小:");
    qlineeditfilesize=new QLineEdit;

    labelfilecreatetime=new QLabel("文件创建时间:");
    qlineeditfilecreatetime=new QLineEdit;

    labelfilemodifytime=new QLabel("文件修改时间:");
    qlineeditfilemodifytime=new QLineEdit;

    labelfileaccesstime=new QLabel("文件访问时间:");
    qlineeditfileaccesstime=new QLineEdit;


    qlabelfileattribute=new QLabel("文件属性");
    qcheckboxisfile=new QCheckBox("文件");
    qcheckboxishide =new QCheckBox("隐藏属性");
    qcheckboxisreadable =new QCheckBox("只读属性");
    qcheckboxiswritable=new QCheckBox("只写属性");
    qcheckboxisexecute=new QCheckBox("执行权限");
    qpushbuttongetfileattributeinfo=new QPushButton("获取文件属性的全部数据信息...");



    // 布局
    QGridLayout *glayout=new QGridLayout;
    glayout->addWidget(labelfilename,0,0);
    glayout->addWidget(qlineeditfilename,0,1);
    glayout->addWidget(qpushbuttongetfilename,0,2);

    glayout->addWidget(labelfilesize,1,0);
    glayout->addWidget(qlineeditfilesize,1,1,1,2);

    glayout->addWidget(labelfilecreatetime,2,0);
    glayout->addWidget(qlineeditfilecreatetime,2,1,1,2);

    glayout->addWidget(labelfilemodifytime,3,0);
    glayout->addWidget(qlineeditfilemodifytime,3,1,1,2);

    glayout->addWidget(labelfileaccesstime,4,0);
    glayout->addWidget(qlineeditfileaccesstime,4,1,1,2);

    // 水平布局
    QHBoxLayout *hlayout=new QHBoxLayout;
    hlayout->addWidget(qlabelfileattribute);
    hlayout->addStretch();

    QHBoxLayout *hlayoutat=new QHBoxLayout;
    hlayoutat->addWidget(qcheckboxisfile);
    hlayoutat->addWidget(qcheckboxishide);
    hlayoutat->addWidget(qcheckboxisreadable);
    hlayoutat->addWidget(qcheckboxiswritable);
    hlayoutat->addWidget(qcheckboxisexecute);

    QHBoxLayout *hlayoutgetbtn=new QHBoxLayout;
    hlayoutgetbtn->addWidget(qpushbuttongetfileattributeinfo);



    //  垂直布局
    QVBoxLayout *vlayout=new QVBoxLayout(this);
    vlayout->addLayout(glayout);
    vlayout->addLayout(hlayout);
    vlayout->addLayout(hlayoutat);
    vlayout->addLayout(hlayoutgetbtn);


    // 信号与槽函数连接
    connect(qpushbuttongetfilename,SIGNAL(clicked()),this,SLOT(getfilepathandname()));

    connect(qpushbuttongetfileattributeinfo,SIGNAL(clicked()),this,SLOT(getfileattributeinfo()));
}

GetFileInfo::~GetFileInfo()
{
}

void GetFileInfo::getfilepathandname()
{
    QString filepathname;
    filepathname=QFileDialog::getOpenFileName(this,"打开文件对话框","/","files(*)");
    qlineeditfilename->setText(filepathname);

}

void GetFileInfo::getfileattributeinfo()
{
    QString strfile=qlineeditfilename->text();

    QFileInfo qfi(strfile);

    qint64 filesize=qfi.size(); // 获取文件容量大小
    QDateTime createtime=qfi.created(); // 文件创建时间
    QDateTime lastmodifytime=qfi.lastModified(); // 最后修改时间
    QDateTime lastaccesstime=qfi.lastRead(); // 最后访问时间


    bool bfile=qfi.isFile();
    bool bhide=qfi.isHidden();
    bool bread=qfi.isReadable();
    bool bwrite=qfi.isWritable();
    bool bexecute=qfi.isExecutable();


    qlineeditfilesize->setText(QString::number(filesize));
    qlineeditfilecreatetime->setText(createtime.toString());
    qlineeditfilemodifytime->setText(lastmodifytime.toString());
    qlineeditfileaccesstime->setText(lastaccesstime.toString());

    qcheckboxisfile->setCheckState(bfile?Qt::Checked:Qt::Unchecked);
    qcheckboxishide->setCheckState(bhide?Qt::Checked:Qt::Unchecked);
    qcheckboxisreadable->setCheckState(bread?Qt::Checked:Qt::Unchecked);
    qcheckboxiswritable->setCheckState(bwrite?Qt::Checked:Qt::Unchecked);
    qcheckboxisexecute->setCheckState(bexecute?Qt::Checked:Qt::Unchecked);

}

getfilefo.h

#ifndef GETFILEINFO_H
#define GETFILEINFO_H

#include <QDialog>

#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>

#include <QFileDialog> // 引用文件对话框
#include <QDateTime>
#include <QHBoxLayout>
#include <QVBoxLayout>

class GetFileInfo : public QDialog
{
    Q_OBJECT

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

private:
    QLabel *labelfilename;
    QLineEdit *qlineeditfilename;
    QPushButton *qpushbuttongetfilename;

    // 文件容量大小
    QLabel *labelfilesize;
    QLineEdit *qlineeditfilesize;

    // 文件创建时间
    QLabel *labelfilecreatetime;
    QLineEdit *qlineeditfilecreatetime;


    // 文件修改时间
    QLabel *labelfilemodifytime;
    QLineEdit *qlineeditfilemodifytime;

    // 文件访问时间
    QLabel *labelfileaccesstime;
    QLineEdit *qlineeditfileaccesstime;

    // 文件属性及复选控件
    QLabel *qlabelfileattribute;

    QCheckBox *qcheckboxisfile;
    QCheckBox *qcheckboxishide;
    QCheckBox *qcheckboxisreadable;
    QCheckBox *qcheckboxiswritable;
    QCheckBox *qcheckboxisexecute;
    QPushButton *qpushbuttongetfileattributeinfo;

    // 声明槽函数
private slots:
    void getfilepathandname();
    void getfileattributeinfo();


};
#endif // GETFILEINFO_H

main.cpp

#include "getfileinfo.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    GetFileInfo w;
    w.show();
    return a.exec();
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

istio介绍(一)

1. 概念 1.1 虚拟服务 虚拟服务提供流量路由功能&#xff0c;它基于 Istio 和平台提供的基本的连通性和服务发现能力&#xff0c;让您配置如何在服务网格内将请求路由到服务 示例&#xff1a; apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:nam…

高项.项目管理经验、理念、教训

一、项目管理的一些经验 管项目重在管理&#xff0c;而不是死抠无关紧要的技术细节等等。 真正的团队一定是11>2&#xff0c;要把重心放在凝聚团队协力&#xff0c;共同完成目标上。 项目的推进永远都是不确定性的&#xff0c;真正考验项目经理的是不断出现的需求变更和状…

vue重修之路由【上】

文章目录 单页应用程序: SPA - Single Page Application路由简介Vue Reouter简介VueRouter的使用&#xff08;52&#xff09;组件的存放目录问题组件分类存放目录 路由的封装抽离 单页应用程序: SPA - Single Page Application 单页面应用(SPA): 所有功能在 一个html页面 上 单…

常用的跨域解决方案有哪些?

在 Web 开发中,跨域是指在浏览器环境下,通过 JavaScript 代码从一个域名的网页去访问另一个域名的资源。由于同源策略的限制,跨域请求通常会被浏览器阻止,为了实现跨域访问,HTML5 提供了一些机制来解决这个问题。 以下是一些常用的跨域解决方案: 1:JSONP(JSON with P…

展馆导览系统之AR互动式导航与展品语音讲解应用

一、项目背景 随着科技的进步和人们对于文化、艺术、历史等方面需求的提升&#xff0c;展馆在人们的生活中扮演着越来越重要的角色。然而&#xff0c;传统的展馆导览方式&#xff0c;如纸质导览、人工讲解等&#xff0c;已无法满足参观者的多元化需求。为了提升参观者的体验&a…

​CUDA学习笔记(六)Warp解析

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 Warp 逻辑上&#xff0c;所有thread是并行的&#xff0c;但是&#xff0c;从硬件的角度来说&#xff0c;实际上并不是所有的thread能够在同一时刻执行&#xff0c;接下来我们将解释有关wa…

​CUDA学习笔记(五)GPU架构

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 GPU架构 SM&#xff08;Streaming Multiprocessors&#xff09;是GPU架构中非常重要的部分&#xff0c;GPU硬件的并行性就是由SM决定的。 以Fermi架构为例&#xff0c;其包含以下主要组成…

什么是SpringMVC?简单好理解!

1、SpringMVC是什么&#xff1f; SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的几部分。简化开发&…

并发编程-线程池ThreadPoolExecutor底层原理分析(一)

问题&#xff1a; 线程池的核心线程数、最大线程数该如何设置&#xff1f; 线程池执行任务的具体流程是怎样的&#xff1f; 线程池的五种状态是如何流转的&#xff1f; 线程池中的线程是如何关闭的&#xff1f; 线程池为什么一定得是阻塞队列&#xff1f; 线程发生异常&…

蓝桥杯 (饮料换购,C++)

思路&#xff1a; 1、先加上初始的饮料数n。 2、再加上n可以兑换的饮料数n/3&#xff0c;求多余的瓶盖n%3。循环直至瓶盖数无法兑换新的一瓶饮料。 #include<iostream> using namespace std; int main() {int n,a0,sum0;cin >> n;sum n;while (n){n n a;//加上上…

【软考】11.5 测试原则/阶段/测试用例设计/调试

《测试原则和方法》 测试原则 测试&#xff1a;为了发现错误而执行程序的过程成功的测试&#xff1a;发现了至今尚未发现的错误的测试 测试方法 静态测试&#xff08;有效发现30%-70%的错误&#xff09; a. &#xff08;文档&#xff09;检查单 b. &#xff08;代码&#xff…

学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例

要想通过SpringBoot写一个简单的处理请求的服务器&#xff08;方法&#xff09;&#xff0c;需要有以下步骤 建立连接请求响应 来复习的话直接在文章末尾看源码就行 1、创建SpringBoot项目 https://blog.csdn.net/dream_ready/article/details/133948253 2、编写Controller建…

WebSocket的入门秘籍?

一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c…

postman打开后,以前的接口记录不在,问题解决

要不这些文件保存在C:\Users\{用户名}\AppData\Roaming\Postman 比如&#xff0c;你目前使用的window登录用户是abc&#xff0c;那么地址便是C:\Users\abc\AppData\Roaming\Postman 打开后&#xff0c;这个目录下会有一些命名为backup-yyyy-MM-ddThh-mm-ss.SSSZ.json类似的文…

[python 刷题] 287 Find the Duplicate Number

[python 刷题] 287 Find the Duplicate Number 题目&#xff1a; Given an array of integers nums containing n 1 integers where each integer is in the range [1, n] inclusive. There is only one repeated number in nums, return this repeated number. You must sol…

zookeeper的介绍和用docker搭建zookeeper集群,以及Go语言使用zookeeper

typora-copy-images-to: imgs Zookeeper的使用 1、Zookeeper简介 Apache ZooKeeper 是 Apache 软件基金会的一个软件项目&#xff0c;为大型分布式系统提供开源分布式配置服务、同步服务和命名注册。ZooKeeper原本是Hadoop的一个子项目&#xff0c;但现在它本身已经是一个顶级…

新年学新语言Go之三

一、前言 这一篇简单介绍一下Go中的数组、切片、map和指针。 二、数组 Go语言的数组和Java差不多都是定长的&#xff0c;用于存储有相同类型的元素&#xff0c;数组在内存中是连续分配的&#xff0c;索引数组中任意数据速度都非常快。 注&#xff1a;Go声明变量和其它强类型…

C++前缀和算法的应用:得到连续 K 个 1 的最少相邻交换次数 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 滑动窗口 题目 给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动&#xff0c;你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包…

FL Studio中文最新21破解版本水果软件下载

那么&#xff0c;大家知道编曲是什么吗&#xff1f;编曲和作曲又有什么区别呢&#xff1f; 一首歌的制作过程通常是由作词或作曲开始的&#xff0c;作曲就是运用基本乐理、和声学、复调、配器法、曲式结构的技术理论体系来表达创作者音乐思想的方法。说白了其实就是制作一首歌…

学信息系统项目管理师第4版系列34_10大管理49过程ITTO

整合管理 组 过程 输入 工具和技术 输出 启动 制定项目章程 立项管理文件协议事业环境因素组织过程资产 专家判断数据收集人际关系与团队技能会议 项目章程假设日志 计划 2.制定项目管理计划 项目章程其他知识领域规划过程的输出事业环境因素组织过程资产 专家…