一、目录操作(QDir 类)
QDir 类提供访问系统目录结构
QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统
Qt 使用“/”作为通用目录分隔符,与“/”在 URL 中用作路径分隔符的方式相同。如果您总是使用“/”作为目录分隔符,Qt 将转换您的路径以符合底层操作系统。
QDir 可以使用相对路径或绝对路径指向文件。绝对路径以目录分隔符开头(在 Windows 下,可以选择以驱动器规格开头)。相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。
下面是QDir的一些常用方法:
- 构造函数:QDir(const QString &path = QString())
- 判断路径是否存在:bool exists() const;
- 判断是否是文件:bool isFile() const;
- 判断是否是文件夹:bool isDir() const;
- 获取当前路径:QString absolutePath() const;
- 获取文件名:QString fileName() const;
- 获取文件目录:QString dirName() const;
- 获取文件大小:qint64 size() const;
- 获取文件的创建时间:QDateTime created() const;
- 获取文件的最后修改时间: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(); }