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_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;
    }

   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值