Qt使用"/"来作为通用的目录分隔符,所以表示文件路径的字符串中我们最好用"/"
使用"/",Qt会自动的转换你的路径来匹配你当前使用的操作系统
常用静态方法
获取当前项目所在的路径
[static] QString QDir::currentPath()
获取当前正在执行的exe所在路径
[static] QString QCoreApplication::applicationDirPath()
获取当前正在执行的exe的全路径,包含exe文件的名称
[static] QString QCoreApplication::applicationFilePath()
常用方法
判断某个目录是否存在
bool QDir::exists() const
根据指定路径创建一个目录
bool QDir::mkpath(const QString &dirPath) const
比如dirPath为"/AA/BB",则会递归在根目录下创建出AA,在AA下面处创建出BB
创建一个子目录
bool QDir::mkdir(const QString &dirName) const
比如某个目录为/AA/BB,如果dirName指定为CC,那么会创建一个CC的子目录,路径为/AA/BB/CC
跳转到上一级目录
bool QDir::cdUp()
获取某个目录下所有文件和目录的完整信息
//参数1:指定过滤器,就是指定过滤出什么类型的文件
//参数2:指定排序规则,就是指定过滤出来的结果如何排序
//返回值:返回一个QFileInfo的列表,存储着每一个过滤出来的文件或者文件夹的完整信息
QFileInfoList QDir::entryInfoList(
QDir::Filters filters = NoFilter,
QDir::SortFlags sort = NoSort) const
其中filters有以下常用取值(可以通过|将多个取值进行连接):
- QDir::Dirs,过滤出所有的文件夹
- QDir::Files,过滤出所有的文件
- QDir::NoDotAndDotDot,过滤结果中去掉"."和".."
获取某个目录下所有文件和目录的名字
//参数:同上
//返回值:返回一个QFileInfo的列表,存储着每一个过滤出来的文件或者文件夹的名字
QStringList QDir::entryList(
QDir::Filters filters = NoFilter,
QDir::SortFlags sort = NoSort) const
获取某个目录的绝对路径(如果是文件的话带名称)
QString QDir::absolutePath() const
- 如果目录是/AA/BB/cc.txt,则返回/AA/BB/cc.txt
- 如果是目录/AA/BB,则返回/AA/BB
获取某个目录下指定文件的绝对路径
QString QDir::absoluteFilePath(const QString &fileName) const
如果指定文件的文件名为main.cpp
- 如果目录是/AA/BB/cc.txt,则返回/AA/BB/cc.txt/main.cpp
- 如果是目录/AA/BB,则返回/AA/BB/main.cpp
获取目录名
QString QDir::dirName() const
- 如果目录是/AA/BB/cc.txt,则返回cc.txt
- 如果是目录/AA/BB,则返回BB
举例1:获取父目录的路径
QString cur_path = QCoreApplication::applicationDirPath();
QDir d(cur_path);
//跳到上一级
d.cdUp();
QString d_father = d.absolutePath();
举例2:递归遍历某个目录
void qtdirtest(QString path){QDir dir(path);//dir.entryInfoList()获取所有文件的文件信息foreach(QFileInfo mfi ,dir.entryInfoList()){if(mfi.isFile()){qDebug()<< "File :" << mfi.fileName(); //获得文件名称}else//是文件夹的话继续递归遍历{if(mfi.fileName()=="." || mfi.fileName() == "..")continue;qDebug() << "Entry Dir" << mfi.absoluteFilePath(); //获得文件夹名称及路径qtdirtest(mfi.absoluteFilePath());}}
}
举例3:递归获取某个目录的大小
//获取文件夹下面的文件大小总和
qint64 getDirAllFileSize(const QString& path)
{QDir dir(path);qint64 size=0;//先过滤出所有文件//然后获取所有文件的大小foreach (QFileInfo info, dir.entryInfoList(QDir::Files)) {size+=info.size();}//然后过滤出所有的文件夹//递归获取每个文件下所有文件的大小总和foreach (QString dir, dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)) {//递归获取文件夹下面的文件大小size+=getDirAllFileSize(path+QDir::separator()+dir);}return size;
}
举例4:使用列表展示某个目录下的所有文件和目录,此处为根目录
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QLineEdit>
#include<QListWidget>
#include<QListWidgetItem>
#include<QDir>
#include<QFileInfo>
#include<QVBoxLayout>
#include<QStandardPaths>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr) : QWidget(parent){resize(400,600);edit=new QLineEdit("/",this);m_list=new QListWidget(this);QVBoxLayout* v_box=new QVBoxLayout(this);v_box->addWidget(edit);v_box->addWidget(m_list);QString root("/");QDir root_dir(root);QStringList str_list;//获取目录下的所有文件//另一个重载形式,可以根据名称过滤,{"*"}可以过滤出所有QFileInfoList info_list=root_dir.entryInfoList({"*"});//调用展示文件信息到列表控件的函数displayFileInfo(info_list);//列表里的条目被双击时connect(m_list,&QListWidget::itemDoubleClicked,this,[=](QListWidgetItem* item){QString dir_path=item->data(Qt::UserRole+1).toString();//是文件夹则将该文件夹下的文件显示到列表中if(!dir_path.isEmpty()){edit->setText(dir_path);QDir dir_temp(dir_path);QFileInfoList info_list_temp=dir_temp.entryInfoList({"*"});displayFileInfo(info_list_temp);}});}~Widget()=default;
private:QLineEdit* edit;QListWidget* m_list;public slots:void displayFileInfo(QFileInfoList list){//清空列表控件里的数据m_list->clear();for(int i=0;i<list.size();++i){QString file_name=list[i].fileName();QListWidgetItem* item=new QListWidgetItem();item->setText(file_name);if(list[i].isDir()){item->setIcon(QIcon(":/mulu.png"));//要传Qt::UserRole,其他整数值代表其他role,有其他意义--参考:enum Qt::ItemDataRole//是文件夹的话则将文件夹的路径携带进去item->setData(Qt::UserRole+1,QVariant(list[i].filePath()));}if(list[i].isFile()){item->setIcon(QIcon(":/wenjian.png"));}m_list->addItem(item);}}
};
#endif // WIDGET_H
学习链接:https://github.com/0voice