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_OBJECT
public:
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_OBJECT
public:
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("获取文件属性");
//删除当前布局Layout
QLayout *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;
}
}