1.目录操作 QDir 类
QDir类提供对目录结构及其内容的访问。QDir用于操作路径名,访问有关路径和文件的信息以及底层文件系统。它还可以用于访问Qt的资源系统。
Qt使用 “ / ” 作为通用目录分隔符,与 “ / ” 在URL中作用路径分隔符的方式相同。如果你总是使用 “ / ” 作为目录分隔符,Qt将转换您的路径以符合底层操作系统。
QDir可以使用相对路径或绝对路径指向文件。绝对路径以目录分隔符开头(在windows下,可以选自驱动器规格开头)。相对文件名以目录名或 文件名开头,并指定相对当前的路径。
QDir是Qt Framework提供的一个目录操作类,用于对文件系统中的目录进行访问和操作。它可以列出目录中的文件和子目录,创建新的目录和文件,删除目录和文件,检查文件或目录是否存在,以及修改文件名等。
QDir的主要功能:
-
构造函数:通过不同参数的组合来创建QDir对象,可以指定路径、过滤器、排序规则等信息。
-
目录遍历:通过entryList()函数获取目录中的文件列表和子目录列表,也可以通过QDirIterator迭代器来实现遍历。
-
创建和删除目录:使用mkdir()函数创建新的目录,使用rmdir()函数删除已有的目录。
-
文件操作:使用QFile类进行文件读写操作,可以通过QFile::copy、QFile::rename、QFile::remove等函数实现文件操作。
-
文件过滤和排序:通过设置过滤器和排序规则来筛选和排序目录中的文件和子目录。
-
其他功能:判断文件或目录是否存在、获取目录的绝对路径、设置当前目录等。
QFileInfo
用于获取文件或目录的元信息,如文件名、路径、大小、创建时间、访问时间、修改时间等。可以通过该类提供的函数对文件或目录进行判断,例如判断文件是否存在、是否是隐藏文件、是否是符号链接等。
可以使用fileName()函数获取文件名,absoluteFilePath()函数获取绝对路径,和absolutePath()函数获取文件所在目录的绝对路径。
QFileInfo fileInfo("/path/to/file.txt");
qDebug() << fileInfo.fileName(); // 输出 "file.txt"
qDebug() << fileInfo.absoluteFilePath(); // 输出 "/path/to/file.txt"
qDebug() << fileInfo.absolutePath(); // 输出 "/path/to"
可以使用exists()函数判断文件是否存在。
QFileInfo fileInfo("/path/to/nonexistent/file.txt");
if (fileInfo.exists())
{ qDebug() << "File exists";
} else {
qDebug() << "File does not exist";
}
可以使用isFile()函数判断文件是否是普通文件,isDir()函数判断文件是否是目录,isSymLink()函数判断文件是否是符号链接等。
QFileInfo fileInfo("/path/to/directory");
if (fileInfo.isFile()) {
qDebug() << "This is a file";
} else if (fileInfo.isDir()) {
qDebug() << "This is a directory";
} else if (fileInfo.isSymLink()) {
qDebug() << "This is a symbolic link";
}
可以使用size()函数获取文件大小(单位为字节)。
QFileInfo fileInfo("/path/to/file.txt");
qDebug() << "File size:" << fileInfo.size() << "bytes";
可以使用created()函数获取文件创建时间,lastModified()函数获取文件最后修改时间,和lastRead()函数获取文件最后访问时间。
QFileInfo fileInfo("/path/to/file.txt");
qDebug() << "File created:" << fileInfo.created().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "File last modified:" << fileInfo.lastModified().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "File last read:" << fileInfo.lastRead().toString("yyyy-MM-dd hh:mm:ss");
QFileInfoList
QFileInfoList是一个用于存储QFileInfo对象的列表类。QFileInfoList可以使用QDir类中的entryInfoList()或entryInfoList()函数获取当前目录下文件或子目录的信息,并将这些信息作为QFileInfo对象添加到QFileInfoList中。QFileInfoList可以方便地对文件和目录进行遍历、过滤和排序等操作。
举例1:获取当前路径下目录下的文件和文件大小
效果:
![](https://img-blog.csdnimg.cn/8e147bd65fb24571a30258ad2187967e.png)
#include <QCoreApplication>
#include <QDir>
#include <QtDebug>
//自定义函数实现获取目录大小
qint64 GetDirFileInfoSizeFunc(const QString &qpath)
{
//QDir类专门用来操作路径名称或底层文件系统,可以使用相对路径和绝对路径来指向一个文件/目录
QDir qdirs(qpath);
qint64 qsize=0;//存放目录占据空间
//QFileInfo 用于获取文件和目录的相关信息,例如文件名、路径、大小、修改时间等。
//可以通过QFileInfo构造函数传入文件或目录的路径来创建一个QFileInfo对象,然后调用其成员函数获取相应的信息。
//ententryInfoList(QDir::Files) 是 QDir 类中的一个函数,用于获取指定目录下的文件列表。
//其中,QDir::Files 参数表示只列出当前目录下的文件,不包括子目录。
foreach(QFileInfo finfo,qdirs.entryInfoList(QDir::Files))
{
qsize=qsize+finfo.size();
}
//QDir::Dirs列出所以子目录。
//QDir::NoDotAndDotDot不列出文件系统中的特殊文件,表示在文件夹中不包含"."和".."两个特殊目录。这通常用于过滤掉当前目录和上级目录。
//将每个子目录的路径名作为QString类型的参数sDir传递给循环体中的代码块。
foreach(QString sDir,qdirs.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
{
//QDir::separator()是一个静态函数,返回操作系统使用的路径分隔符。在Windows上,
//它返回反斜杠“\”,在Unix/Linux上,它返回正斜杠“/”。
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;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//该字符串存放路径
QString strpath;
strpath=QDir::currentPath();//获取当前目录
qDebug()<<"当前目录为:"<<qPrintable(strpath);
//调用此函数求占据空间的大小
GetDirFileInfoSizeFunc(strpath);
return a.exec();
}
举例2:打开文件并显示路径的小案例
效果:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QListWidget> //列表框
#include <QListWidgetItem> //用于表示列表框中的列表项
#include <QLineEdit> //单行文本框
#include <QDir>//获取操作路径及底层文件系统
#include <QFileInfoList> //获取指定目录的基本信息
/*QFileInfoList用于存储QFileInfo对象的列表。每个QFileInfo对象包含有关文件或目录的元数据,
* 例如路径,大小,修改日期和访问权限等信息。QFileInfoList通常用于获取目录中所有文件或子目录的元数据列表,
* 并执行各种操作,例如复制,移动,删除或重命名文件。*/
#include <QVBoxLayout> //垂直布局
#include <QStringList>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
QLineEdit *filelineedit;//显示所选择目录名称
QListWidget *fileListWidget;//列表框:展示目录和文件
QVBoxLayout *qvlayout;//垂直布局
void dispfileinfolist(QFileInfoList list);//显示目录文件所对应图标
private slots:
void dispdir(QDir dir); //
void disdirshow(QListWidgetItem *item); //
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
resize(500,300);
setWindowTitle("QDir综合应用测试");
filelineedit=new QLineEdit("/");
fileListWidget=new QListWidget;
qvlayout=new QVBoxLayout(this);
qvlayout->addWidget(filelineedit);
qvlayout->addWidget(fileListWidget);
QString root="/"; //根目录 此程序在d盘下 所以根目录为d盘目录 可改其他路径 如c:/ e:/
QDir rootDir(root);
QStringList strlist;
strlist<<"*"; //所有文件
//获取根目录下所有文件和子目录的信息放入到list中
QFileInfoList list =rootDir.entryInfoList(strlist);
//调用此函数来显示
dispfileinfolist(list);
connect(fileListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem *)),this,SLOT(disdirshow(QListWidgetItem *)));
}
Dialog::~Dialog()
{
}
void Dialog::dispfileinfolist(QFileInfoList list)//显示目录文件所对应图标
{
fileListWidget->clear(); //先清空列表视图
for (int i = 0;i<list.count();i++) {
QFileInfo tempfileinfo=list[i]; //获取listinfo中的info
if(tempfileinfo.isDir()) //判断是目录
{
QIcon ioc("d:/dir.jpg"); //用于表示图标
QString filename=tempfileinfo.fileName();//获取文件名
//创建一个列表项并设置图标和名字
QListWidgetItem *temp=new QListWidgetItem(ioc,filename);
fileListWidget->addItem(temp);//添加项到列表中
}else if(tempfileinfo.isFile()) //判断是文件
{
QIcon ioc("d:/file.jpg"); //用于表示图标
QString filename=tempfileinfo.fileName();//获取文件名
//创建一个列表项并设置图标和名字
QListWidgetItem *temp=new QListWidgetItem(ioc,filename);
fileListWidget->addItem(temp);//添加项到列表中
}
}
}
void Dialog::dispdir(QDir dir) //在列表控件中显示当前目录下的文件和子目录
{
QStringList strlist;
strlist<<"*";//所有文件
//QDir::AllEntries: 表示获取所有类型的文件和目录信息,包括文件、目录、符号链接等。
//QDir::DirsFirst: 表示先列出所有子目录,再列出文件,且按字母顺序排序。
QFileInfoList fileinfolist=dir.entryInfoList(strlist,QDir::AllEntries,QDir::DirsFirst);
dispfileinfolist(fileinfolist); //调用显示方法将fileinfolist列表显示出来
}
void Dialog::disdirshow(QListWidgetItem *item) //在文本框中显示当前目录
{
QDir dir;
QString str=item->text(); //获取当前双击的item的文件名
//qDebug()<<str;
dir.setPath(filelineedit->text());//设置当前的文本路径为dir的路径
dir.cd(str); //转到文件名为str的路径
filelineedit->setText(dir.absolutePath());//获取文件或目录的绝对路径并设置到文本框中
dispdir(dir); //将当先双击选择的路径放入dispdir中显示在列表中
}