QT之文件类

发布于:2025-05-23 ⋅ 阅读:(15) ⋅ 点赞:(0)

QFileInfo 获取文件信息

在这里插入图片描述

界面布局

上面的文件路径到文件访问时间是QGridLayout
下面的文件属性是QHBoxLayout
一起放在QVBoxLayout

GetFileInfo::GetFileInfo(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("获取文件属性项目实战模块");

    labelfilename=new QLabel("文件路径名称:");
    qlineeditfilename=new QLineEdit;
    qpushbuttongetfilename=new QPushButton("打开文件...");

    labelfilesize=new QLabel("文件容量大小:");
    qlineeditfilesize=new QLineEdit;

    labelfilecreatetime=new QLabel("文件创建时间:");
    qlineeditfilecreatetime=new QLineEdit;

    labelfilemodifytime=new QLabel("文件修改时间:");
    qlineeditfilemodifytime=new QLineEdit;

    labelfileaccesstime=new QLabel("文件访问时间:");
    qlineeditfileaccesstime=new QLineEdit;


    qlabelfileattribute=new QLabel("文件属性");
    qcheckboxisfile=new QCheckBox("文件");
    qcheckboxishide =new QCheckBox("隐藏属性");
    qcheckboxisreadable =new QCheckBox("只读属性");
    qcheckboxiswritable=new QCheckBox("只写属性");
    qcheckboxisexecute=new QCheckBox("执行权限");
    qpushbuttongetfileattributeinfo=new QPushButton("获取文件属性的全部数据信息...");



    // 布局
    QGridLayout *glayout=new QGridLayout;
    glayout->addWidget(labelfilename,0,0);
    glayout->addWidget(qlineeditfilename,0,1);
    glayout->addWidget(qpushbuttongetfilename,0,2);

    glayout->addWidget(labelfilesize,1,0);
    glayout->addWidget(qlineeditfilesize,1,1,1,2);

    glayout->addWidget(labelfilecreatetime,2,0);
    glayout->addWidget(qlineeditfilecreatetime,2,1,1,2);

    glayout->addWidget(labelfilemodifytime,3,0);
    glayout->addWidget(qlineeditfilemodifytime,3,1,1,2);

    glayout->addWidget(labelfileaccesstime,4,0);
    glayout->addWidget(qlineeditfileaccesstime,4,1,1,2);

    // 水平布局
    QHBoxLayout *hlayout=new QHBoxLayout;
    hlayout->addWidget(qlabelfileattribute);
    hlayout->addStretch();

    QHBoxLayout *hlayoutat=new QHBoxLayout;
    hlayoutat->addWidget(qcheckboxisfile);
    hlayoutat->addWidget(qcheckboxishide);
    hlayoutat->addWidget(qcheckboxisreadable);
    hlayoutat->addWidget(qcheckboxiswritable);
    hlayoutat->addWidget(qcheckboxisexecute);

    QHBoxLayout *hlayoutgetbtn=new QHBoxLayout;
    hlayoutgetbtn->addWidget(qpushbuttongetfileattributeinfo);



    //  垂直布局
    QVBoxLayout *vlayout=new QVBoxLayout(this);
    vlayout->addLayout(glayout);
    vlayout->addLayout(hlayout);
    vlayout->addLayout(hlayoutat);
    vlayout->addLayout(hlayoutgetbtn);


    // 信号与槽函数连接
    connect(qpushbuttongetfilename,SIGNAL(clicked()),this,SLOT(getfilepathandname()));

    connect(qpushbuttongetfileattributeinfo,SIGNAL(clicked()),this,SLOT(getfileattributeinfo()));
}

槽函数获取目录

void GetFileInfo::getfilepathandname()
{
    QString filepathname;
    //getOpenFileName创建模态文件选择对话框。用户确认后返回所选文件的路径(QString),取消则返回空字符串
    filepathname=QFileDialog::getOpenFileName(
        this,               // 父窗口指针,对话框将模态显示在该窗口上
        "打开文件对话框",     // 对话框标题(中文显示)
        "/",                // 默认打开的初始目录(根目录)
        "files(*)"          // 文件过滤器(显示所有文件)
        );

    qlineeditfilename->setText(filepathname);

}

槽函数获取文件信息

QCheckBox 单选按钮

    QCheckBox *qcheckboxisfile;
    QCheckBox *qcheckboxishide;
    QCheckBox *qcheckboxisreadable;
    QCheckBox *qcheckboxiswritable;
    QCheckBox *qcheckboxisexecute;
void GetFileInfo::getfileattributeinfo()
{
    QString strfile=qlineeditfilename->text();

    QFileInfo qfi(strfile);

    qint64 filesize=qfi.size(); // 获取文件容量大小
    QDateTime createtime=qfi.created(); // 文件创建时间
    QDateTime lastmodifytime=qfi.lastModified(); // 最后修改时间
    QDateTime lastaccesstime=qfi.lastRead(); // 最后访问时间


    bool bfile=qfi.isFile();
    bool bhide=qfi.isHidden();
    bool bread=qfi.isReadable();
    bool bwrite=qfi.isWritable();
    bool bexecute=qfi.isExecutable();


    qlineeditfilesize->setText(QString::number(filesize));
    qlineeditfilecreatetime->setText(createtime.toString());
    qlineeditfilemodifytime->setText(lastmodifytime.toString());
    qlineeditfileaccesstime->setText(lastaccesstime.toString());

    qcheckboxisfile->setCheckState(bfile?Qt::Checked:Qt::Unchecked);
    qcheckboxishide->setCheckState(bhide?Qt::Checked:Qt::Unchecked);
    qcheckboxisreadable->setCheckState(bread?Qt::Checked:Qt::Unchecked);
    qcheckboxiswritable->setCheckState(bwrite?Qt::Checked:Qt::Unchecked);
    qcheckboxisexecute->setCheckState(bexecute?Qt::Checked:Qt::Unchecked);

}

QDir.entryList()获取文件列表

在这里插入图片描述

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 该字符串存储路径
    QString strPath;

    strPath=QDir::currentPath(); // 获取当前目录
    qDebug()<<"当前目录为:"<<strPath<<Qt::endl;

    // 调用此函数求目录占据空间的大小
    GetDirFileInfoSizeFunc(strPath);

    return a.exec();
}
// 自定义函数实现获取目录下大小
qint64 GetDirFileInfoSizeFunc(const QString &qpath)
{
    // QDir类专门用来操作路径名称或底层文件系统,可以使用相对或绝对路径来指向一个文件/目录
    QDir qdirs(qpath);

    qint64 qsize=0; // 存放目录占据空间

    // QFileInfor类提供有关文件系统当中文件名称、路径(位置)、访问权限、文件类型等等信息
    // entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表
    //返回的是 QFileInfoList,由 QFileInfo 对象组成的列表  QDir::Files:只筛选文件
    foreach(QFileInfo finfo,qdirs.entryInfoList(QDir::Files))
    {
        qsize=qsize+finfo.size();
    }

    // QDir::Dirs列出目录。QDir::separator()不列出文件系统当中的特殊文件
    //返回的是 QStringList   QDir::NoDotAndDotDot:排除.和..这两个特殊目录
    foreach(QString sDir,qdirs.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
    {
	    //递归调用获取文件夹里的目录大小
        //QDir::separator()返回当前操作系统所使用的目录分隔符
        qsize=qsize+GetDirFileInfoSizeFunc(qpath+QDir::separator()+sDir);
    }

    char uint='B';

    qint64 currentdirsize=qsize;

    if(currentdirsize>1024)
    {
        currentdirsize=currentdirsize/1024;
        uint='K';

        if(currentdirsize>1024)
        {
            currentdirsize=currentdirsize/1024;
            uint='M';
            if(currentdirsize>1024)
            {
                currentdirsize=currentdirsize/1024;
                uint='G';
                if(currentdirsize>1024)
                {
                    currentdirsize=currentdirsize/1024;
                    uint='T';
                }
            }
        }
    }

    qDebug()<<"目录占据空间为:"<<currentdirsize<<"\t"<<qPrintable(qpath);


    return qsize;
}

QDir类综合应用

在这里插入图片描述

#include "qdirfileviews.h"

QDirFileViews::QDirFileViews(QWidget *parent)
    : QDialog(parent)
{
    resize(500,350);

    setWindowTitle("QDir类综合控件应用测试");

    filelineedit=new QLineEdit("/");
    filelistwidget=new QListWidget;

    glayout=new QVBoxLayout(this);
    glayout->addWidget(filelineedit);
    glayout->addWidget(filelistwidget);

    // 信号与槽函数连接
    //当用户在文本框内按下回车键(Enter)或者 Return 键时,这个信号就会被触发
    //connect(filelineedit,SIGNAL(returnPressed()),this,SLOT(dispdir(QDir)));

    connect(filelistwidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),
            this,SLOT(dispdirshow(QListWidgetItem*)));

    QString root="/";
    //创建一个指向指定路径的 QDir 对象。路径可以是绝对路径或相对路径。
    QDir rootDir(root);
    QStringList strlist;
    strlist<<"*";

    // entryInfoList函数获取过滤 之后 获得的文件名夹下面的文件信息列表
    QFileInfoList list=rootDir.entryInfoList(strlist);

    // 调用此函数来显示
    dispfileinfolist(list);//显示根目录下的文件和文件夹,用来供用户双击

}

双击 QListWidgetItem 后进入目录的操作

判断是目录还是文件采用不同的图标

 // 显示目录和文件所对应图标
void QDirFileViews::dispfileinfolist(QFileInfoList list)
{
    filelistwidget->clear();

    for (unsigned int i=0;i<list.count();i++)
    {
        QFileInfo tempfileinfo=list.at(i);

        if(tempfileinfo.isDir()) // 判断是目录
        {
            QIcon ico("d:/Jolly/QTC++/zero_voice/08/5.QDirFile/dir.jpg");
            QString filename=tempfileinfo.fileName();
            QListWidgetItem *temp=new QListWidgetItem(ico,filename);
            filelistwidget->addItem(temp);
        }
        else if(tempfileinfo.isFile()) // 判断是文件
        {
            QIcon ico("d:/Jolly/QTC++/zero_voice/08/5.QDirFile/file.jpg");
            QString filename=tempfileinfo.fileName();
            QListWidgetItem *temp=new QListWidgetItem(ico,filename);
            filelistwidget->addItem(temp);
        }
    }

}

设置点击文件夹以后QLineEdit显示的总路径

void QDirFileViews::dispdirshow(QListWidgetItem *item)
{
    QDir dir;
    QString str=item->text();//双击的QListWidgetItem的内容

/*
若需基于当前目录导航(如进入子目录),且希望自动处理相对路径并检查有效性,使用 cd()。
cd() 在路径不存在时会返回 false,且不会改变当前路径。

若需直接设置完整路径(无论相对或绝对),且不关心路径是否存在,使用 setPath()。
setPath() 不会检查路径是否存在,无论路径是否有效都会设置成功。
*/

    //setPath() 不处理相对路径,它会直接设置为传入的路径
    dir.setPath(filelineedit->text());//之前的目录路径

    //QDir.cd(str) 把当前 QDir 对象所指向的目录修改为指定的目录
    //cd() 支持相对路径。如果传入相对路径,会基于当前目录进行导航
    dir.cd(str);

    filelineedit->setText(dir.absolutePath());

    dispdir(dir);//双击后展示子目录
}

通过 QDir.entryInfoList() 获取目录下的所有文件
QFileInfor类提供有关文件系统当中文件名称、路径(位置)、访问权限、文件类型等等信息
entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表

void QDirFileViews::dispdir(QDir dir)
{
    QStringList strlist;
    strlist<<"*";

    //QDir::AllEntries: 这是一个过滤器标志,表示要列出所有类型的条目,涵盖文件、目录以及符号链接
    //QDir::DirsFirst: 这是排序标志,意味着目录会排在文件前面
    QFileInfoList fileinfolist=dir.entryInfoList(strlist,QDir::AllEntries,QDir::DirsFirst);


    dispfileinfolist(fileinfolist);
}

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到