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

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

一、目录操作(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();
}
相关文章
|
16天前
|
API
【Qt】Qt定时器类QTimer
【Qt】Qt定时器类QTimer
|
21天前
|
C++
【qt】自定义代理类
【qt】自定义代理类
7 0
|
21天前
|
搜索推荐
【qt】自定义界面类
【qt】自定义界面类
13 0
Qt (QInputDialog 、QMessageBox、QMessageBox)对话框实战
Qt (QInputDialog 、QMessageBox、QMessageBox)对话框实战
Qt (QFileDialog&QColorDialog&QFontDialog) 对话框实战
Qt (QFileDialog&QColorDialog&QFontDialog) 对话框实战
Qt (QFileDialog&QColorDialog&QFontDialog) 对话框实战
|
1月前
|
开发者
Qt 布局(QSplitter 类&QDockWidget 类) 总结
Qt 布局(QSplitter 类&QDockWidget 类) 总结
Qt 布局(QSplitter 类&QDockWidget 类) 总结
|
1月前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
42 0
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
59 8
C++ Qt开发:QTcpSocket网络通信组件
|
1月前
|
区块链
【qt】最快的开发界面效率——混合编程3
【qt】最快的开发界面效率——混合编程
37 1