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
-
- #include
- #include
- #include
-
-
- // 自定义函数实现获取目录下大小
- 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()<<"目录占据空间为:"<
"\t"<<qPrintable(qpath); -
-
- return qsize;
- }
-
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
-
- // 该字符串存储路径
- QString strPath;
-
- strPath=QDir::currentPath(); // 获取当前目录
- qDebug()<<"当前目录为:"<
-
- // 调用此函数求目录占据空间的大小
- GetDirFileInfoSizeFunc(strPath);
-
- return a.exec();
- }
编译执行结果:
二、QDir 类综合应用展示系统文件实战操作
展示系统文件如下:
代码示例:
qdirfileviews.h
- #ifndef QDIRFILEVIEWS_H
- #define QDIRFILEVIEWS_H
-
- #include
-
- #include
// 列表框 - #include
- #include
// 单行输入框/单行编辑框 -
- #include
// 获取操作路径及底层文件系统 - #include
// 获取指定目录的基本数据信息 -
- #include
// 垂直布局 -
- #include
-
-
- 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
-
- 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
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
-
- #include
- #include
- #include
- #include
-
- #include
// 引用文件对话框 - #include
- #include
- #include
-
- 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
-
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- GetFileInfo w;
- w.show();
- return a.exec();
- }