QT提供的与文件和目录相关的类包括以下几个:
QCoreApplication:用于提取应用程序路径、程序名等文件信息
QFile:除了打开文件操作外,还可以复制文件、删除文件等功能
QFileInfo:用于提取文件信息,包括路径、文件名、后缀等
QDir:用于提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件,文件重命名等操作
QTemporaryDir、QTemporaryFile:用于创建临时目录和临时文件
QFileSystemWatc:文件和目录监听类、监听目录下文件的添加、删除等变化,监听文件修改变化
一、QCoreApplication
QCoreApplication是为无GUI引用程序提供时间循环的类,是所有应用程序类的基类,其子类QGuiApplication为有GUI界面的应用程序提供流控制和主要的设定,QGuiApplication的子类QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等
创建的 Qt Widget Application都是基于QApplication的,在main()函数里可以看到QApplication的应用
QCoreApplication的静态函数
下面的静态函数可以获取应用程序的名称、启动路径等信息(省略了函数参数中的const关键字)
演示案例:
通过QCoreApplication的子类QApplication调用这些函数,来获取我们想要的信息
二、QFile
功能:前面的文件介绍过了QFile对文件的读写功能,QFile还提供了一些静态函数和成员函数用于文件操作
QFile的成员函数
setFileName():如果QFile在初始化时没有指定文件,可以使用该函数指定文件,但是只能调用一次,后面就不可以再调用了
附加函数:
errorString(); //获取错误信息
Permissions文件访问权限
文件访问权限是整型,一般用16进制显示。是一组权限的组合
演示案例
QFile按钮的clicked函数
void Widget::on_btn_QFile_clicked() { QString fileName=QFileDialog::getOpenFileName(this,QStringLiteral("请选择一个文件"),\ QDir::currentPath(),QStringLiteral(".h文件(*.h);;所有文件(*.*)")); if(fileName.isEmpty()) return; QFile aFile(fileName); if(!aFile.open(QIODevice::ReadOnly|QIODevice::Text)) return; ui->plainTextEdit->appendPlainText(QStringLiteral("文件大小:")+QString::number(aFile.size())+"\n"); ui->plainTextEdit->appendPlainText(QStringLiteral("文件访问权限:")+QString::number(aFile.permissions(),16)+"\n"); aFile.close();
三、QFileInfo
功能:QFileInfo类的接口可以获取文件的各种信息(包括目录名、文件基名(不带后缀)、文件后缀等),利用这些函数可以实现灵活的文件操作
可以用QFileInfo的构造函数指定一个文件名作为当前文件,也可以使用setFile()函数指定一个文件作为当前的文件
常用函数:
除了最后一个静态函数exists()之外,其他都是公共接口函数
演示案例:
打开并打印文件信息(路径和大小)
QFile file("image.jpg"); QFileInfo info(file);//获取文件的信息 qDebug() << QStringLiteral("路径") << info.absoluteFilePath() << QStringLiteral("大小") << info.size(); file.close();
打开一个文件,并且更改名称(在磁盘上也更改了)
void Widget::on_btn_QFileInfo_clicked() { QString oldFileName=QFileDialog::getOpenFileName(this,QStringLiteral("请选择一个文件"),\ QDir::currentPath(),QStringLiteral(".h文件(*.h);;所有文件(*.*)")); if(oldFileName.isEmpty()) return; QFileInfo fileInfo(oldFileName); QString newFileName=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ"; //设置新文件名称 QFile::rename(oldFileName,newFileName); //改名 ui->plainTextEdit->appendPlainText(QStringLiteral("源文件名为:")+oldFileName+"\n"); ui->plainTextEdit->appendPlainText(QStringLiteral("重命名为:")+newFileName); }
四、QDir
功能:QDir是进行目录操作的类,在创建QDir对象时传递一个目录字符串作为当前目录,然后QDir函数就可以针对这个目录或目录下的文件进行操作
QDir对象不给出路径时,默认的是当前程序.exe的目录
QDir静态函数(省略了函数参数中的const关键字)
附加函数:
absolutePath();//返回QDir给出的路径,返回值为QString
current(); //返回当前路径以及各种信息
QDir的成员函数(省略了函数参数中的const关键字)
entryList()函数的参数:
需要传递QDir::Filter枚举类型的参数以获取不同的结果(枚举类型的常用取值如下)或者使用过滤器返回特定类型的文件、子目录名
QDir::AllDirs ==>列出所有目录名
QDir::Files ==>列出所有文件
QDir::Drives ==>列出所有盘符(Unix系统下无效)
QDir::NoDotAndDotDot ==>不列出特殊的符号,如".",".."
QDir::AllEntries ==>列出目录下所有项目
//过滤器的使用 Dir mDir(QDir::current()); QStringList filters; filters<<"*.cpp"<<"*.h"<<"*.txt"<<".pro"; //设置指定的文件类型 mDir.setNameFilters(filters); //设置过滤器 qDebug()<<mDir.entryList(filters, QDir::Files); //打印帅选出的条目
exists(); //如果路径中含有标点符号可能会不识别 附加函数: count(); //返回路径下的文件数量(文件夹+文件),隐藏文件也会加进去 cd(); //进入指定路径,不同盘下需要切换盘 cdUp(); //返回上一级 entryList(); //返回目录中所有文件和目录的名称列表 entryInfoList(); //返回目录中QFileInfo对象列表(包含对象为entryList) entryInfoList().size();//返回目录下文件、文件夹数量
目录属性函数
isReadable();
isAbsolute();
isRelative();
isRoot();
演示案例
例:打印路径下的所有文件与文件夹
QDir dir("E:\QT"); foreach (QFileInfo mItem, dir.entryInfoList())//遍历路径下的每一项 { if(mItem.isDir())//如果是文件夹 { qDebug() << " Dir " << mItem.filePath(); //打印路径 } else//如果不是文件夹 { qDebug() << "File" << mItem.filePath(); } }
打印当前的目录信息
void Widget::on_btn_QDir_clicked() { ui->plainTextEdit->appendPlainText(QStringLiteral("临时文件目录名称:")+QDir::tempPath()+"\n"); ui->plainTextEdit->appendPlainText(QStringLiteral("根目录名称:")+QDir::rootPath()+"\n"); ui->plainTextEdit->appendPlainText(QStringLiteral("主目录名称:")+QDir::homePath()+"\n"); ui->plainTextEdit->appendPlainText(QStringLiteral("当前目录名称:")+QDir::currentPath()+"\n"); }
五、QTemporaryDir、QTemporaryFile
QTemporaryDir:
功能:用于创建、删除临时目录
主要函数如下:
特点:
在系统临时目录,即QDir::tempPath目录下创建一个临时目录,临时目录名称一QCoreApplication::applicationName()为前缀,后加6个字符。
临时目录可以设置为使用完后自动删除,即临时目录变量删除时,临时目录也删除
QTemporaryFile:
功能:用于创建临时文件
特点:
创建的临时文件保存在系统临时目录下
临时文件以QCoreApplication::applicationName()作为文件名,以“XXXXXX”6个随机数字作为文件前缀
QTemporaryFile::setAutoRemove()函数设置为是否自动删除临时文件
QTemporaryFile::open()函数用于打开临时文件,只有打开临时文件,才实际创建了此文件
六、QFileSystemWatcher
功能:QFileSystemWatcher是对目录和文件进行监听的类
directoryChanged()、fileChanged()信号
把某些目录或文件添加到QFileSystemWatcher对象的监听列表后
当监听的目录发生文件新建、删除等操作时会发射directoryChanged信号
当监听的文件发生修改、重命名等操作时,会发生fileChanged信号
常用函数如下(省略了函数参数中的const关键字)
演示案例:
点击监听按钮,使用addPath函数对一个文件和一个目录开启监听,使用connect()将信号与槽相关联
点击取消监听,使用removePath()对刚才的文件和目录取消监听,并使用disconnect()解除信号与槽的关联
第一步:在类中定义一个QFileSystemWatcher对象,和两个自定义槽函数
第二步:点击两个按钮,分别选择一个文件和目录
void Widget::on_btn_selectFile_clicked() { QString fileName=QFileDialog::getOpenFileName(this,QStringLiteral("请选择一个文件"),QDir::currentPath()); if(fileName.isEmpty()) return; ui->lineEdit_file->setText(fileName); } void Widget::on_btn_selectDir_clicked() { QString dirName=QFileDialog::getExistingDirectory(this,QStringLiteral("选择一个目录"),QDir::currentPath()); if(dirName.isEmpty()) return; ui->lineEdit_dir->setText(dirName); }
第三步:点击监听按钮,对上面选择的文件和目录开启监听,并且绑定信号与槽的关系
void Widget::on_btn_startWather_clicked() { //添加监听对象 fileWathcer.addPath(ui->lineEdit_file->text()); fileWathcer.addPath(ui->lineEdit_dir->text()); //绑定信号与槽 QObject::connect(&fileWathcer,&QFileSystemWatcher::directoryChanged,this,&Widget::on_directoryChanged); QObject::connect(&fileWathcer,&QFileSystemWatcher::fileChanged,this,&Widget::on_fileChanged); }
第四步:点击停止监听按钮,对上面选择的文件和目录取消监听,并且解除信号与槽的关系
void Widget::on_btn_stopWather_clicked() { //解除监听对象 fileWathcer.removePath(ui->lineEdit_file->text()); fileWathcer.removePath(ui->lineEdit_dir->text()); //解除信号与槽 QObject::connect(&fileWathcer,&QFileSystemWatcher::directoryChanged,this,&Widget::on_directoryChanged); QObject::connect(&fileWathcer,&QFileSystemWatcher::fileChanged,this,&Widget::on_fileChanged); }
第五步:定义两个槽函数,当接收到信号时触发
void Widget::on_fileChanged(const QString path) { ui->plainTextEdit->appendPlainText(path); ui->plainTextEdit->appendPlainText(QStringLiteral("文件发生了变化")); } void Widget::on_directoryChanged(const QString path) { ui->plainTextEdit->appendPlainText(path); ui->plainTextEdit->appendPlainText(QStringLiteral("目录发生了变化")); }
演示效果
选择一个文件和目录,改变文件的内容/在目录下新建一个文件,都会触发槽函数
————————————————
版权声明:本文为CSDN博主「江南、董少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41453285/article/details/100019987

