QT 目录
QT 目录
在Qt框架中,QDir 是一个用于操作目录和文件路径的类。
它提供了许多方法来处理目录和文件,例如列出目录内容、创建目录、删除目录等。
// QDir 类是 Qt 框架中用于操作目录和文件路径的重要类。以下是 QDir 类的所有成员函数和枚举类型的详细列表:// 枚举类型
enum QDir::Filter {Dirs, // 只列出目录AllDirs, // 列出所有目录,包括隐藏目录Files, // 只列出文件Drives, // 列出驱动器(在 Windows 上)NoSymLinks, // 不列出符号链接NoDotAndDotDot, // 不列出 "." 和 ".."AllEntries, // 列出所有条目(目录和文件)Readable, // 只列出可读的条目Writable, // 只列出可写的条目Executable, // 只列出可执行的条目Modified, // 只列出已修改的条目Hidden, // 列出隐藏条目System, // 列出系统条目CaseSensitive // 区分大小写
};enum QDir::SortFlag {Name, // 按名称排序Time, // 按修改时间排序Size, // 按大小排序Type, // 按类型排序Unsorted, // 不排序NoSort, // 不排序DirsFirst, // 目录在前DirsLast, // 目录在后Reversed, // 反向排序IgnoreCase, // 忽略大小写LocaleAware // 使用本地化排序
};// 构造函数
QDir();
QDir(const QDir &dir);
QDir(const QString &path);
QDir(const QString &path, const QString &nameFilter, SortFlags sort, Filters filters);// 析构函数
~QDir();// 公共成员函数
QString absoluteFilePath(const QString &fileName) const; // 返回文件的绝对路径
QString absolutePath() const; // 返回目录的绝对路径
QString canonicalPath() const; // 返回目录的规范路径
bool cd(const QString &dirName); // 切换到指定目录
bool cdUp(); // 切换到上级目录
uint count() const; // 返回目录中的条目数量
QString dirName() const; // 返回目录名称
QFileInfoList entryInfoList(const QStringList &nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const; // 返回目录条目的信息列表
QFileInfoList entryInfoList(Filters filters = NoFilter, SortFlags sort = NoSort) const; // 返回目录条目的信息列表
QStringList entryList(const QStringList &nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const; // 返回目录条目的名称列表
QStringList entryList(Filters filters = NoFilter, SortFlags sort = NoSort) const; // 返回目录条目的名称列表
bool exists(const QString &name) const; // 检查指定名称的条目是否存在
bool exists() const; // 检查目录是否存在
引例
#include <QCoreApplication>
#include <QDir>
#include <QStringList>
#include <QDebug>//自定义函数,获取指定目录下的文件信息
qint64 getDirFileSize(const QString& filePath)
{double size = 0;//遍历路径所有文件和子目录,计算大小QDir dir(filePath);for (auto finfo: dir.entryInfoList(QDir::Files )){//只遍历文件size += finfo.size();}//遍历子目录for(auto finfo: dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)){size = size+getDirFileSize(filePath + QDir::separator() + finfo);//递归调用}char unit='B';double currentSize=size;if (currentSize>1024){currentSize=currentSize/1024;unit='K';if (currentSize>1024){currentSize=currentSize/1024;unit='M';if (currentSize>1024){currentSize=currentSize/1024;unit='G';if (currentSize>1024){currentSize=currentSize/1024;unit='T';}}}}qDebug() << "目录: "<< filePath << " 大小: " <<currentSize << unit;//保留两位小数//返回大小return currentSize;
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//获取当前目录QString currentPath = QDir::currentPath();qDebug() << "当前目录: " << currentPath;qDebug() << "当前目录下的文件大小: " << getDirFileSize(currentPath);return a.exec();
}
文件夹浏览器
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>#include <QListWidget>//引入了列表控件
#include <QListWidgetItem>//引入了列表项控件
#include <QLineEdit>//引入了文本输入框控件
#include <QDir>//引入了目录处理类
#include <QFileInfoList> //引入了文件信息列表类
#include <QBoxLayout> //引入了布局管理类
#include <QStringList> //引入了字符串列表类class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();private:QLineEdit *filelineEdit;//文件路径输入框QListWidget *filelistWidget;//文件列表控件QBoxLayout *mainLayout;//主布局public:void setFileDir(QFileInfoList fileInfoList);//设置文件目录public slots:void displayDir(QDir dir); //显示目录void displayFile(QListWidgetItem *item); //显示文件
};
#endif // DIALOG_H
#include "dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent)
{setWindowTitle("文件目录");//引入logo图片this->setWindowIcon(style()->standardIcon(QStyle::SP_FileDialogContentsView));mainLayout=new QVBoxLayout(this);filelineEdit=new QLineEdit();filelistWidget=new QListWidget();//显示文件列表mainLayout->addWidget(filelineEdit);mainLayout->addWidget(filelistWidget);QString root ="/"; //设置根目录QDir dir(root);//打开根目录QStringList strlist;//存放目录下的文件名strlist<<"*";//设置显示所有文件QFileInfoList list=dir.entryInfoList(strlist);//获取目录下所有文件信息setFileDir(list);connect(filelistWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(displayFile(QListWidgetItem*)));
}Dialog::~Dialog() {}//设置文件目录
void Dialog::setFileDir(QFileInfoList fileInfoList){filelistWidget->clear();//清空文件列表for(int i=0;i<fileInfoList.size();i++) {//遍历文件信息QFileInfo fileInfo = fileInfoList.at(i);//获取文件信息if (fileInfo.isDir()) {//如果是目录QListWidgetItem *item = new QListWidgetItem(style()->standardIcon(QStyle::SP_DirIcon), fileInfo.fileName());item->setData(Qt::UserRole, fileInfo.absoluteFilePath()); //设置item的用户数据为目录路径filelistWidget->addItem(item);} else {//如果是文件QListWidgetItem *item = new QListWidgetItem(style()->standardIcon(QStyle::SP_FileIcon), fileInfo.fileName());item->setData(Qt::UserRole, fileInfo.absoluteFilePath()); //设置item的用户数据为文件路径filelistWidget->addItem(item);}}
}//显示目录
void Dialog::displayDir(QDir dir) {QStringList strlist;//存放目录下的文件名strlist<<"*";//设置显示所有文件QFileInfoList list=dir.entryInfoList(strlist,QDir::Dirs|QDir::Files);//获取目录下所有文件信息setFileDir(list);//设置文件目录}//显示文件
void Dialog::displayFile(QListWidgetItem *item){QDir dir;QString str=item->text();dir.setPath(filelineEdit->text());dir.cd(str);filelineEdit->setText(dir.absolutePath());displayDir(dir);}
文件信息获取示例
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>#include <QFileDialog>
#include <QDateTime>
#include <QBoxLayout>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:QLabel *labelfilename;QLineEdit *qlineeditfilename;QPushButton *buttonbrowse;QCheckBox *checkboxisfile;//文件QCheckBox *checkboxisdir;//文件夹QCheckBox *checkboxisreadonly;//只读QCheckBox *checkboxishidden;//隐藏QCheckBox *checkboxisexecutable;//执行QPushButton *buttongetfileinfo;QLabel *labelfilesize;QLineEdit* qlineeditfilesize;//文件创建时间QLabel *labelfilecreatetime;QLineEdit *qlineeditfilecreatetime;//修改时间QLabel *labelfilemodifytime;QLineEdit *qlineeditfilemodifytime;//文件访问时间QLabel *labelfileaccesstime;QLineEdit *qlineeditfileaccesstime;//文件属性QLabel *labelfileattribute;private slots://获取选择的文件路径void getfilepathname();//获取文件信息void getfileinfo();
};
#endif // MAINWINDOW_H
#include <QMessageBox>
#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{setWindowTitle("获取文件属性");//删除当前布局LayoutQLayout *layout = this->layout();if (layout!= nullptr) {delete layout;}//创建新的布局QGridLayout *mainLayout = new QGridLayout();//setLayout(mainLayout);labelfilename = new QLabel("文件路径:");qlineeditfilename = new QLineEdit();buttonbrowse = new QPushButton("浏览");mainLayout->addWidget(labelfilename, 0, 0);mainLayout->addWidget(qlineeditfilename, 0, 1, 1, 4);mainLayout->addWidget(buttonbrowse, 0, 5);labelfilesize = new QLabel("文件大小:");qlineeditfilesize = new QLineEdit();mainLayout->addWidget(labelfilesize, 1, 0);mainLayout->addWidget(qlineeditfilesize, 1, 1, 1, 5);labelfilecreatetime = new QLabel("创建时间:");qlineeditfilecreatetime = new QLineEdit();mainLayout->addWidget(labelfilecreatetime, 2, 0);mainLayout->addWidget(qlineeditfilecreatetime, 2, 1, 1, 5);labelfilemodifytime = new QLabel("修改时间:");qlineeditfilemodifytime = new QLineEdit();mainLayout->addWidget(labelfilemodifytime, 3, 0);mainLayout->addWidget(qlineeditfilemodifytime, 3, 1, 1, 5);labelfileaccesstime = new QLabel("访问时间:");qlineeditfileaccesstime = new QLineEdit();mainLayout->addWidget(labelfileaccesstime, 4, 0);mainLayout->addWidget(qlineeditfileaccesstime, 4, 1, 1, 5);labelfileattribute= new QLabel("文件属性:");mainLayout->addWidget(labelfileattribute, 5, 0);checkboxisfile=new QCheckBox("文件");checkboxisdir=new QCheckBox("目录");checkboxisreadonly=new QCheckBox("只读");checkboxishidden=new QCheckBox("隐藏");checkboxisexecutable=new QCheckBox("可执行");mainLayout->addWidget(checkboxisfile, 6, 0);mainLayout->addWidget(checkboxisdir, 6, 1);mainLayout->addWidget(checkboxisreadonly, 6, 2);mainLayout->addWidget(checkboxishidden, 6, 3);mainLayout->addWidget(checkboxisexecutable, 6, 4);buttongetfileinfo = new QPushButton("获取文件信息");mainLayout->addWidget(buttongetfileinfo, 7, 0, 1, 6);QVBoxLayout *vbox = new QVBoxLayout(this);//创建垂直布局vbox->addLayout(mainLayout);connect(buttonbrowse, SIGNAL(clicked()), this, SLOT(getfilepathname()));connect(buttongetfileinfo, SIGNAL(clicked()), this, SLOT(getfileinfo()));
}MainWindow::~MainWindow() {}
//获取选择的文件路径
void MainWindow::getfilepathname(){QString path;//可以选择目录和文件//path = QFileDialog::getExistingDirectory(this, "选择目录", "");path = QFileDialog::getOpenFileName(this, "选择文件", "", "All Files (*)");qlineeditfilename->setText(path);}
//获取文件信息
void MainWindow::getfileinfo(){QString filepath = qlineeditfilename->text();QFileInfo fileinfo(filepath);//获取文件信息if(fileinfo.exists()) {//判断文件是否存在qint64 size = fileinfo.size();//获取文件大小QDateTime createtime =fileinfo.birthTime();//获取创建时间QDateTime modifytime =fileinfo.lastModified();//获取修改时间QDateTime accesstime =fileinfo.lastRead();//获取访问时间qlineeditfilesize->setText(QString::number(size/1024.000)+"KB");//转换单位qlineeditfilecreatetime->setText(createtime.toString("yyyy-MM-dd hh:mm:ss"));qlineeditfilemodifytime->setText(modifytime.toString("yyyy-MM-dd hh:mm:ss"));qlineeditfileaccesstime->setText(accesstime.toString("yyyy-MM-dd hh:mm:ss"));if(fileinfo.isFile()){checkboxisfile->setChecked(true);checkboxisdir->setChecked(false);}else{checkboxisfile->setChecked(false);checkboxisdir->setChecked(true);}if(fileinfo.isHidden()){//判断是否隐藏checkboxishidden->setChecked(true);}else {checkboxishidden->setChecked(false);}if(fileinfo.isReadable()) {//判断是否只读checkboxisreadonly->setChecked(true);}else{checkboxisreadonly->setChecked(false);}if(fileinfo.isExecutable()) {//判断是否可执行checkboxisexecutable->setChecked(true);}else{checkboxisexecutable->setChecked(false);}}else{QMessageBox::warning(this, "错误", "文件不存在!");return;}}