Qt使用"/"来作为通用的目录分隔符,所以表示文件路径的字符串中我们最好用"/"
使用"/",Qt会自动的转换你的路径来匹配你当前使用的操作系统
常用静态方法
获取当前项目所在的路径
[static] QString QDir::currentPath()
获取当前正在执行的exe所在路径
[static] QString QCoreApplication::applicationDirPath()
比如/AA/BB
获取当前正在执行的exe的全路径,包含exe文件的名称
[static] QString QCoreApplication::applicationFilePath()
比如/AA/BB/cc.exe
常用方法
判断某个目录是否存在
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,过滤结果中去掉"."和".."
获取某个目录下所有文件和目录的名字
//参数:同上
//返回值:返回一个QString的列表,存储着每一个过滤出来的文件或者文件夹的名字
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
删除当前目录下所有内容,包括目录本身
bool QDir::removeRecursively()
举例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_OBJECT
public:
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