• Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战


    一、目录操作(QDir 类)

    QDir 类提供访问系统目录结构

    QDir 类提供对目录结构及其内容的访问。QDir 用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它还可以用于访问 Qt 的资源系统

    Qt 使用“/”作为通用目录分隔符,与“/”在 URL 中用作路径分隔符的方式相同。如果您总是使用“/”作为目录分隔符,Qt 将转换您的路径以符合底层操作系统。


    QDir 可以使用相对路径或绝对路径指向文件。绝对路径以目录分隔符开头(在 Windows 下,可以选择以驱动器规格开头)。相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。

    下面是QDir的一些常用方法:

    1. 构造函数:QDir(const QString &path = QString())

    2. 判断路径是否存在:bool exists() const;

    3. 判断是否是文件:bool isFile() const;

    4. 判断是否是文件夹:bool isDir() const;

    5. 获取当前路径:QString absolutePath() const;

    6. 获取文件名:QString fileName() const;

    7. 获取文件目录:QString dirName() const;

    8. 获取文件大小:qint64 size() const;

    9. 获取文件的创建时间:QDateTime created() const;

    10. 获取文件的最后修改时间:QDateTime lastModified() const;

    案例分析:

    main.cpp

    1. #include
    2. #include
    3. #include
    4. #include
    5. // 自定义函数实现获取目录下大小
    6. qint64 GetDirFileInfoSizeFunc(const QString &qpath)
    7. {
    8. // QDir类专门用来操作路径名称或底层文件系统,可以使用相对或绝对路径来指向一个文件/目录
    9. QDir qdirs(qpath);
    10. qint64 qsize=0; // 存放目录占据空间
    11. // QFileInfor类提供有关文件系统当中文件名称、路径(位置)、访问权限、文件类型等等信息
    12. // entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表
    13. foreach(QFileInfo finfo,qdirs.entryInfoList(QDir::Files))
    14. {
    15. qsize=qsize+finfo.size();
    16. }
    17. // QDir::Dirs列出目录。QDir::separator()不列出文件系统当中的特殊文件
    18. foreach(QString sDir,qdirs.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
    19. {
    20. qsize=qsize+GetDirFileInfoSizeFunc(qpath+QDir::separator()+sDir);
    21. }
    22. char uint='B';
    23. qint64 currentdirsize=qsize;
    24. if(currentdirsize>1024)
    25. {
    26. currentdirsize=currentdirsize/1024;
    27. uint='K';
    28. if(currentdirsize>1024)
    29. {
    30. currentdirsize=currentdirsize/1024;
    31. uint='M';
    32. if(currentdirsize>1024)
    33. {
    34. currentdirsize=currentdirsize/1024;
    35. uint='G';
    36. if(currentdirsize>1024)
    37. {
    38. currentdirsize=currentdirsize/1024;
    39. uint='T';
    40. }
    41. }
    42. }
    43. }
    44. qDebug()<<"目录占据空间为:"<"\t"<<qPrintable(qpath);
    45. return qsize;
    46. }
    47. int main(int argc, char *argv[])
    48. {
    49. QCoreApplication a(argc, argv);
    50. // 该字符串存储路径
    51. QString strPath;
    52. strPath=QDir::currentPath(); // 获取当前目录
    53. qDebug()<<"当前目录为:"<
    54. // 调用此函数求目录占据空间的大小
    55. GetDirFileInfoSizeFunc(strPath);
    56. return a.exec();
    57. }

    编译执行结果:

    二、QDir 类综合应用展示系统文件实战操作

    展示系统文件如下:

    代码示例:

    qdirfileviews.h

    1. #ifndef QDIRFILEVIEWS_H
    2. #define QDIRFILEVIEWS_H
    3. #include
    4. #include // 列表框
    5. #include
    6. #include // 单行输入框/单行编辑框
    7. #include // 获取操作路径及底层文件系统
    8. #include // 获取指定目录的基本数据信息
    9. #include // 垂直布局
    10. #include
    11. class QDirFileViews : public QDialog
    12. {
    13. Q_OBJECT
    14. public:
    15. QDirFileViews(QWidget *parent = nullptr);
    16. ~QDirFileViews();
    17. private:
    18. QLineEdit *filelineedit; // 显示所选择目录名称
    19. QListWidget *filelistwidget; // 列表框:展示目录和文件
    20. QVBoxLayout *glayout; // 垂直布局
    21. public:
    22. void dispfileinfolist(QFileInfoList list); // 显示目录和文件所对应图标
    23. public slots:
    24. void dispdir(QDir dir);
    25. void dispdirshow(QListWidgetItem *item);
    26. };
    27. #endif // QDIRFILEVIEWS_H

    main.cpp

    1. #include "qdirfileviews.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. QDirFileViews w;
    7. w.show();
    8. return a.exec();
    9. }

    qdirfileviews.cpp

    1. #include "qdirfileviews.h"
    2. QDirFileViews::QDirFileViews(QWidget *parent)
    3. : QDialog(parent)
    4. {
    5. resize(500,350);
    6. setWindowTitle("QDir类综合控件应用测试");
    7. filelineedit=new QLineEdit("/");
    8. filelistwidget=new QListWidget;
    9. glayout=new QVBoxLayout(this);
    10. glayout->addWidget(filelineedit);
    11. glayout->addWidget(filelistwidget);
    12. // 信号与槽函数连接
    13. connect(filelineedit,SIGNAL(returnPressed()),this,SLOT(dispdir(QDir)));
    14. connect(filelistwidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),
    15. this,SLOT(dispdirshow(QListWidgetItem*)));
    16. QString root="/";
    17. QDir rootDir(root);
    18. QStringList strlist;
    19. strlist<<"*";
    20. // entryInfoList函数获取过滤之后获得的文件名夹下面的文件信息列表
    21. QFileInfoList list=rootDir.entryInfoList(strlist);
    22. // 调用此函数来显示
    23. dispfileinfolist(list);
    24. }
    25. QDirFileViews::~QDirFileViews()
    26. {
    27. }
    28. void QDirFileViews::dispfileinfolist(QFileInfoList list) // 显示目录和文件所对应图标
    29. {
    30. filelistwidget->clear();
    31. for (unsigned int i=0;icount();i++)
    32. {
    33. QFileInfo tempfileinfo=list.at(i);
    34. if(tempfileinfo.isDir()) // 判断是目录
    35. {
    36. QIcon ico("d:/dir.jpg");
    37. QString filename=tempfileinfo.fileName();
    38. QListWidgetItem *temp=new QListWidgetItem(ico,filename);
    39. filelistwidget->addItem(temp);
    40. }
    41. else if(tempfileinfo.isFile()) // 判断是文件
    42. {
    43. QIcon ico("d:/file.jpg");
    44. QString filename=tempfileinfo.fileName();
    45. QListWidgetItem *temp=new QListWidgetItem(ico,filename);
    46. filelistwidget->addItem(temp);
    47. }
    48. }
    49. }
    50. void QDirFileViews::dispdir(QDir dir)
    51. {
    52. QStringList strlist;
    53. strlist<<"*";
    54. QFileInfoList fileinfolist=dir.entryInfoList(strlist,QDir::AllEntries,QDir::DirsFirst);
    55. dispfileinfolist(fileinfolist);
    56. }
    57. void QDirFileViews::dispdirshow(QListWidgetItem *item)
    58. {
    59. QDir dir;
    60. QString str=item->text();
    61. dir.setPath(filelineedit->text());
    62. dir.cd(str);
    63. filelineedit->setText(dir.absolutePath());
    64. dispdir(dir);
    65. }

    三、QFilelnfo 类介绍

    QFileInfo是一个类,用于获取关于文件或目录的元信息。它提供了各种方法来检索有关文件或目录的信息,例如文件的大小、创建时间、修改时间、访问权限等。QFileInfo类也可以用于检查文件或目录是否存在,并检索每个文件或目录的绝对路径。

    该类的构造函数需要一个文件路径或目录路径参数。可以使用QFile类的fileInfo方法来生成QFileInfo对象,或者使用QDir类的entryInfo或entryInfoList方法来生成QFileInfo对象。QFileInfo还提供了许多其他的方法,例如isFile(),isDir(),isExecutable()等,用于检查文件或目录的类型和属性。

    QFileInfo类是Qt中用于文件和目录操作的常用类之一,可用于创建、修改或删除文件和目录,或处理文件和目录的元数据。

    四、QFilelnfo 类获取文件属性及相关信息实战

    案例分析:实现下面功能

    代码示例:

    getfileinfo.cpp

    1. #include "getfileinfo.h"
    2. GetFileInfo::GetFileInfo(QWidget *parent)
    3. : QDialog(parent)
    4. {
    5. setWindowTitle("获取文件属性项目实战模块");
    6. labelfilename=new QLabel("文件路径名称:");
    7. qlineeditfilename=new QLineEdit;
    8. qpushbuttongetfilename=new QPushButton("打开文件...");
    9. labelfilesize=new QLabel("文件容量大小:");
    10. qlineeditfilesize=new QLineEdit;
    11. labelfilecreatetime=new QLabel("文件创建时间:");
    12. qlineeditfilecreatetime=new QLineEdit;
    13. labelfilemodifytime=new QLabel("文件修改时间:");
    14. qlineeditfilemodifytime=new QLineEdit;
    15. labelfileaccesstime=new QLabel("文件访问时间:");
    16. qlineeditfileaccesstime=new QLineEdit;
    17. qlabelfileattribute=new QLabel("文件属性");
    18. qcheckboxisfile=new QCheckBox("文件");
    19. qcheckboxishide =new QCheckBox("隐藏属性");
    20. qcheckboxisreadable =new QCheckBox("只读属性");
    21. qcheckboxiswritable=new QCheckBox("只写属性");
    22. qcheckboxisexecute=new QCheckBox("执行权限");
    23. qpushbuttongetfileattributeinfo=new QPushButton("获取文件属性的全部数据信息...");
    24. // 布局
    25. QGridLayout *glayout=new QGridLayout;
    26. glayout->addWidget(labelfilename,0,0);
    27. glayout->addWidget(qlineeditfilename,0,1);
    28. glayout->addWidget(qpushbuttongetfilename,0,2);
    29. glayout->addWidget(labelfilesize,1,0);
    30. glayout->addWidget(qlineeditfilesize,1,1,1,2);
    31. glayout->addWidget(labelfilecreatetime,2,0);
    32. glayout->addWidget(qlineeditfilecreatetime,2,1,1,2);
    33. glayout->addWidget(labelfilemodifytime,3,0);
    34. glayout->addWidget(qlineeditfilemodifytime,3,1,1,2);
    35. glayout->addWidget(labelfileaccesstime,4,0);
    36. glayout->addWidget(qlineeditfileaccesstime,4,1,1,2);
    37. // 水平布局
    38. QHBoxLayout *hlayout=new QHBoxLayout;
    39. hlayout->addWidget(qlabelfileattribute);
    40. hlayout->addStretch();
    41. QHBoxLayout *hlayoutat=new QHBoxLayout;
    42. hlayoutat->addWidget(qcheckboxisfile);
    43. hlayoutat->addWidget(qcheckboxishide);
    44. hlayoutat->addWidget(qcheckboxisreadable);
    45. hlayoutat->addWidget(qcheckboxiswritable);
    46. hlayoutat->addWidget(qcheckboxisexecute);
    47. QHBoxLayout *hlayoutgetbtn=new QHBoxLayout;
    48. hlayoutgetbtn->addWidget(qpushbuttongetfileattributeinfo);
    49. // 垂直布局
    50. QVBoxLayout *vlayout=new QVBoxLayout(this);
    51. vlayout->addLayout(glayout);
    52. vlayout->addLayout(hlayout);
    53. vlayout->addLayout(hlayoutat);
    54. vlayout->addLayout(hlayoutgetbtn);
    55. // 信号与槽函数连接
    56. connect(qpushbuttongetfilename,SIGNAL(clicked()),this,SLOT(getfilepathandname()));
    57. connect(qpushbuttongetfileattributeinfo,SIGNAL(clicked()),this,SLOT(getfileattributeinfo()));
    58. }
    59. GetFileInfo::~GetFileInfo()
    60. {
    61. }
    62. void GetFileInfo::getfilepathandname()
    63. {
    64. QString filepathname;
    65. filepathname=QFileDialog::getOpenFileName(this,"打开文件对话框","/","files(*)");
    66. qlineeditfilename->setText(filepathname);
    67. }
    68. void GetFileInfo::getfileattributeinfo()
    69. {
    70. QString strfile=qlineeditfilename->text();
    71. QFileInfo qfi(strfile);
    72. qint64 filesize=qfi.size(); // 获取文件容量大小
    73. QDateTime createtime=qfi.created(); // 文件创建时间
    74. QDateTime lastmodifytime=qfi.lastModified(); // 最后修改时间
    75. QDateTime lastaccesstime=qfi.lastRead(); // 最后访问时间
    76. bool bfile=qfi.isFile();
    77. bool bhide=qfi.isHidden();
    78. bool bread=qfi.isReadable();
    79. bool bwrite=qfi.isWritable();
    80. bool bexecute=qfi.isExecutable();
    81. qlineeditfilesize->setText(QString::number(filesize));
    82. qlineeditfilecreatetime->setText(createtime.toString());
    83. qlineeditfilemodifytime->setText(lastmodifytime.toString());
    84. qlineeditfileaccesstime->setText(lastaccesstime.toString());
    85. qcheckboxisfile->setCheckState(bfile?Qt::Checked:Qt::Unchecked);
    86. qcheckboxishide->setCheckState(bhide?Qt::Checked:Qt::Unchecked);
    87. qcheckboxisreadable->setCheckState(bread?Qt::Checked:Qt::Unchecked);
    88. qcheckboxiswritable->setCheckState(bwrite?Qt::Checked:Qt::Unchecked);
    89. qcheckboxisexecute->setCheckState(bexecute?Qt::Checked:Qt::Unchecked);
    90. }

    getfilefo.h

    1. #ifndef GETFILEINFO_H
    2. #define GETFILEINFO_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include // 引用文件对话框
    9. #include
    10. #include
    11. #include
    12. class GetFileInfo : public QDialog
    13. {
    14. Q_OBJECT
    15. public:
    16. GetFileInfo(QWidget *parent = nullptr);
    17. ~GetFileInfo();
    18. private:
    19. QLabel *labelfilename;
    20. QLineEdit *qlineeditfilename;
    21. QPushButton *qpushbuttongetfilename;
    22. // 文件容量大小
    23. QLabel *labelfilesize;
    24. QLineEdit *qlineeditfilesize;
    25. // 文件创建时间
    26. QLabel *labelfilecreatetime;
    27. QLineEdit *qlineeditfilecreatetime;
    28. // 文件修改时间
    29. QLabel *labelfilemodifytime;
    30. QLineEdit *qlineeditfilemodifytime;
    31. // 文件访问时间
    32. QLabel *labelfileaccesstime;
    33. QLineEdit *qlineeditfileaccesstime;
    34. // 文件属性及复选控件
    35. QLabel *qlabelfileattribute;
    36. QCheckBox *qcheckboxisfile;
    37. QCheckBox *qcheckboxishide;
    38. QCheckBox *qcheckboxisreadable;
    39. QCheckBox *qcheckboxiswritable;
    40. QCheckBox *qcheckboxisexecute;
    41. QPushButton *qpushbuttongetfileattributeinfo;
    42. // 声明槽函数
    43. private slots:
    44. void getfilepathandname();
    45. void getfileattributeinfo();
    46. };
    47. #endif // GETFILEINFO_H

    main.cpp

    1. #include "getfileinfo.h"
    2. #include
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. GetFileInfo w;
    7. w.show();
    8. return a.exec();
    9. }

  • 相关阅读:
    不安装运行时运行.NET程序
    javaee:spring中Bean的管理
    软考信息安全工程师必会--3000+字文章浅析DES加密算法
    紫杉醇人血清白蛋白纳米粒PTX-HSA|阿霉素卵清白蛋白纳米粒DOX-OVA|顺铂小鼠血清白蛋白纳米粒CDDP-MSA(试剂)
    基于FPGA的自动白平衡算法实现
    vue源码分析(一)——源码目录说明
    【Java从入门到精通】这也许就是Java火热的原因吧!
    测试团队的第一次测试,我们需要做哪些准备?
    element的el-select给下拉框添加背景
    折纸问题
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/133936773