目录类QDir

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值