Qt文件目录操作

server/2024/11/20 4:41:08/

文件目录操作相关类

Qt 为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个:

  • QCoreApplication:用于提取应用程序路径,程序名等文件信息;
  • QFile:除了打开文件操作外,QFile 还有复制文件、删除文件等功能;
  • QFileInfo:用于提取文件信息,包括路径、文件名、后缀等;
  • QTemporaryDir 和 QTemporaryFile:用于创建临时目录和临时文件;
  • QFileSystemWatcher:文件和目录监听类,监听目录下文件的添加、删除等变化,监听文件修改变化。

这些类基本涵盖了文件操作需要的主要功能,有些功能还在某些类中重复出现,例如 QFile 和 QDIr 都具有删除文件、判断文件是否存在的功能。

实例概述

QCoreApplication 类

QCoreApplication 是为无 GUI 应用程序提供事件循环的类,是所有应用程序类的基类,其子类 QGuiApplication 为有 GUI 界面的应用程序提供流控制和主要设定,QGuiApplication 的子类 QApplication 为基于 QWidget 的应用程序提供支持,包括界面的初始化等。

QCoreApplication 提供了一些有用的静态函数,可以获取应用程序名称、启动路径等信息,几个函数的名称和功能如下:

函数原型功能
QString applicationDirPath()返回应用程序的启动路径
QString applicationFilePath()返回应用程序的带有目录的完整文件名
QString applicationName()返回应用程序名称,无路劲无后缀
QStringList libraryPaths()返回动态加载库文件时应用程序搜索的目录列表
void setOrganizationName(QString& orgName)为应用程序设置一个机构名
QString organizationName()返回应用程序的机构名
void exit()退出应用程序

QFile 类

前面两篇文章使用 QFile 类进行文件操作,使用了 QFile::open()函数。除了打开文件提供读写操作外,QFile 还有一些静态函数和成员函数用于文件操作。

函数原型功能
bool copy(QString& fileName, QSTring& newName)复制文件
bool rename(QString& oldName, QString& newName)重命名文件
bool remove()删除一个文件
bool exists()判断文件是否存在
bool setPermissions(Permissions permissions)设置文件的权限,权限类型是枚举类型。
Permissions permissions()返回文件的权限

静态函数时无需创建 QFile 类对象实例就可以调用的函数,例如使用静态函数 exists()判断一个文件是否存在的代码如下:

void Dialog::on_pushButton_51_clicked()
{showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件bool the=QFile::exists(sous);if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");
}

QFile 还提供了对应的函数成员如下(省略函数参数中的 const 关键字):

函数原型功能
void setFileName(QString& name)设置文件名,文件已打开后不能调用此函数
bool copy(QString& newName)当前文件复制为 newName 表示的文件
bool rename(QString& newName)将当前文件重命名为 newName
bool remove()删除当前文件
bool exists()判断当前文件是否存在
bool setPermissions(Permissions permissions)设置文件权限
Permissions permissions()返回文件权限
qint64 size()返回文件的大小、字节数

创建 QFile 对象时可以在构造函数里指定文件名,也可以用 setFileName()指定文件,但是文件打开后不能再调用 setFileName()函数。指定的文件作为 QFile 对象的当前文件,然后成员函数 copy()rename()等都是基于当前文件的操作。

QFileInfo 类

QFileInfo 类的接口函数提供文件的各种信息。QFileInfo 对象创建时可以指定一个文件名作为当前文件,也可以用 setFile() 函数指定一个文件作为当前文件。

QFileInfo 常见接口函数如下所示。除了一个静态函数 exists()之外,其他都是公共接口函数,接口函数的操作都是针对当前文件:

函数原型功能
void setFile(QString& file)设置一个文件名,作为 QFileInfo 操作的文档
QString absoluteFilePath()返回带有文件名的绝对路径
QString absolutePath()返回绝对路径,不带文件名
QString fileName()返回去除路劲的文件名
QString filePath()返回包含路径的文件名
QString path()返回不含文件名的路径
qint64 size()返回文件大小,以字节为单位
QString baseName()返回文件基名,第一个”.“之前的文件名
QString completeBaseName()返回文件基名,最后一个”.“之前的文件名
QString suffix()最后一个”.“之后的后缀
QString completeSuffix()第一个”.“之后的后缀
bool isDIr()判断当前对象是否是一个目录或目录快捷方式
bool isFile()判断当前对象是否是一个文件或快捷方式
bool isExecutable()判断当前文件是否是可执行文件
QDataTime created()返回文件创建时间
QDataTime lastModified返回文件最后一次被修改的时间
QDataTime lastRead()返回文件最后一次被读取的时间
bool exists()判断文件是否存在
bool exists(QString& file)静态函数,判断 file 表示的文件是否存在

QFileInfo 提供的这些函数可以提取文件信息,包括目录名、文件基名、文件后缀等,利用这些函数可以实现灵活的文件操作。例如,下面的代码是利用 QFile::rename()函数和 QFileInfo 的一些功能实现的文件重命名功能的代码,其中就用到了提取路径、提取文件基名的功能。

void Dialog::on_pushButton_50_clicked()
{//QFile::rename()showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFileInfo   fileInfo(sous);//源文件信息QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ"; //更改文件后缀为".XYZ"QFile::rename(sous,newFile); //重命名文件ui->plainTextEdit->appendPlainText("源文件:"+sous);ui->plainTextEdit->appendPlainText("重命名为:"+newFile+"\n");
}

QDir 类

QDir 是进行目录操作的类,在创建 QDir 对象时传递一个目录字符串作为当前目录,然后 QDir 函数就可以针对当前目录或目录下的文件进行操作。

函数原型功能
QString tempPath()返回临时目录名称
QString rootPath()返回根目录名称
QString homePath()返回主目录名称
QString currentPath()返回当前目录名称
bool setCurrent(QString& paht)设置 path 表示的目录为当前目录
QFileInfoList drives()返回系统的根目录列表,在 Windows 上是盘符

在使用 QFileDialog 选择打开一个文件或目录时需要传递一个初始目录,这个时候就可以使用 QDir::currentPath()获取应用程序当前目录作为初始目录,前面一些实例程序的代码中已经用到过这个功能。

QDir 的一些公共函数接口如下:

函数原型功能
QString absoluteFilePath(QString& fileName)返回当前目录下的一个文件的含绝对路径文件名
QString absolutePath()返回当前目录的绝对路径
QString canonicalPath()返回当前目录的标准路径
QString filePath(QString& fileName)返回目录下一个文件的目录名
QString dirName()返回最后一级目录的名称
bool exists()判断当前目录是否存在
QStringList entryList(Filters filters = NoFilter, SortFlag sort = NoSort)返回目录下的所有文件名,子目录名等
bool mkdir(QString& dirName)在当前目录下建一个名称为 dirName 的目录
bool rmdir(QString& dirName)删除指定的目录
bool remove(QString& fileName)删除当前目录下的文件 fileName
bool rename(QString& oldName, QString& newName)将文件或目录 oldName 改为 newName
void setPath(QString& path)设置 QDir 对象的当前目录
bool removeRecursively()删除当前目录及其下面的所有文件

获取目录下的目录或文件列表的函数 entryList()需要传递 QDir::Filter枚举类型的参数以获取不同的结果,QDir::Filter枚举类型的常用取值如下:

  • QDIr::AllDirs:列出所有目录名;
  • QDir::Files:列出所有文件;
  • QDir::Drives:列出所有盘符(Unix 系统下无效);
  • QDir::NoDotAndDotDot:不列出特殊符号,如“.”和“…”;
  • QDir::AllEntries:列出目录下所有项目。

列出所有子目录的程序如下:

void Dialog::on_pushButton_11_clicked()
{//列出子目录showBtnInfo(sender());QDir    dir(ui->editDir->text());QStringList strList=dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);ui->plainTextEdit->appendPlainText("所选目录下的所有目录:");for(int i=0;i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i));ui->plainTextEdit->appendPlainText("\n");}

列出一个目录下所有文件的程序如下:

void Dialog::on_pushButton_17_clicked()
{//列出所有文件showBtnInfo(sender());QDir    dir(ui->editDir->text());QStringList strList=dir.entryList(QDir::Files);ui->plainTextEdit->appendPlainText("所选目录下的所有文件:");for(int i=0;i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i));ui->plainTextEdit->appendPlainText("\n");
}

QTemporaryDir 和 QTemporaryFile

QTemporaryDir 是用于创建、删除临时目录的类,其主要函数如下:

函数原型功能
void setAutoRemove(bool b)设置为是否自动删除
QString path()返回创建的零时目录名称
bool remove()删除此零时目录及其下面所有文件

在系统临时目录,及 QDir::tempPath目录下创建一个临时目录,临时目录名称以 QCoreApplication::applicationName()为前缀,后加 6 个字符。零时目录可以设置为使用完后自动删除,即临时目录变量删除。

QTemporaryFile 是用于创建临时文件的类,临时文件保存在系统临时目录下。临时文件以 QCoreApplication::applicationName()函数设置为是否自动删除临时文件。QTemporaryFile::open()函数用于打开临时文件,只有打开临时文件,才实际创建了此文件。

QFileSystemWatcher 类

QFileSystemWatcher 是对目录文件进行监听的类。把某些目录或文件添加到 QFileSystemWatcher 对象的监听列表后,当目录下发生文件新建、删除等操作时就会发射 directoryChanged()信号,当监听的文件发生修改、重命名等操作时,会发射 fileChanged()信号。所以,这个类在进行目录或文件监听时起作用。

QFileSystemWatcher 的主要接口函数如下:

函数原型功能
bool addPath(QString& path)添加一个监听的目录或文件
QStringList addPaths(QStringList& paths)添加需要监听的目录或文件列表
QStringList directories()返回监听的目录列表
QStringList files()返回监听的文件列表
bool removePath(QString& path)移除监听的目录或文件
QStringList removePaths(QStringList& paths)移除监听的目录或文件列表

为了测试 QFileSystemWatcher 的功能,在主窗口类中定义了 QFileSystemWatcher 类型的变量和两个信号的槽函数,定义如下:

private:QFileSystemWatcher  fileWatcher;void    showBtnInfo(QObject* btn);
public slots:void on_directoryChanged(const QString path);void on_fileChanged(const QString path);

两个槽函数仅是显示传递的参数,并显示提示文字,代码如下:

void Dialog::on_directoryChanged(const QString path)
{ //directoryChanged()信号的槽函数ui->plainTextEdit->appendPlainText(path);ui->plainTextEdit->appendPlainText("目录发生了变化\n");
}void Dialog::on_fileChanged(const QString path)
{//fileChanged()信号的槽函数ui->plainTextEdit->appendPlainText(path);ui->plainTextEdit->appendPlainText("文件发生了变化\n");
}

QFileSystemWatcher 分组里“addPath()开始监听”和“removePath()停止监听”两个按钮的代码如下:

void Dialog::on_pushButton_46_clicked()
{//开始监听,addPath()showBtnInfo(sender());ui->plainTextEdit->appendPlainText("监听目录:"+ui->editDir->text()+"\n");fileWatcher.addPath(ui->editDir->text());//添加监听目录fileWatcher.addPath(ui->editFile->text());//添加监听文件QObject::connect(&fileWatcher,&QFileSystemWatcher::directoryChanged,this,&Dialog::on_directoryChanged); //directoryChangedQObject::connect(&fileWatcher,&QFileSystemWatcher::fileChanged,this,&Dialog::on_fileChanged); //fileChanged
}void Dialog::on_pushButton_47_clicked()
{//停止监听,removePath()showBtnInfo(sender());ui->plainTextEdit->appendPlainText("停止监听目录:"+ui->editDir->text()+"\n");fileWatcher.removePath(ui->editDir->text());//fileWatcher.removePath(ui->editFile->text());//QObject::disconnect(&fileWatcher,&QFileSystemWatcher::directoryChanged,this,&Dialog::on_directoryChanged); //directoryChangedQObject::disconnect(&fileWatcher,&QFileSystemWatcher::fileChanged,this,&Dialog::on_fileChanged); //fileChanged
}

采用 addPath()函数添加目录和文件后,将信号和槽函数关联起来,开始监听。

停止监听时,用 removePath()函数移除监听的目录和文件,并用 disconnect()解除信号和槽的关联。
参考资料:https://it.0voice.com


http://www.ppmy.cn/server/143373.html

相关文章

查询DBA_FREE_SPACE缓慢问题

这个是一个常见的问题&#xff0c;理论上应该也算是一个bug&#xff0c;在oracle10g&#xff0c;到19c&#xff0c;我都曾经遇到过&#xff1b;今天在给两套新建的19C RAC添加监控脚本时&#xff0c;又发现了这个问题&#xff0c;在这里记录一下。 Symptoms 环境&#xff1a;…

【ChatGPT】让ChatGPT生成特定时间段或主题的文章

让ChatGPT生成特定时间段或主题的文章 ChatGPT能够根据设定的时间段或主题生成文章&#xff0c;但这需要通过设计精准的Prompt来实现。通过结合上下文信息、明确的写作目标和格式要求&#xff0c;您可以高效地引导ChatGPT生成符合预期的内容。本文将详细介绍如何实现这一目标&…

Win10/11 安装使用 Neo4j Community Edition

如果你下载的是 Neo4j Community Edition 的压缩包&#xff0c;意味着你需要手动解压并配置 Neo4j。以下是详细的使用步骤&#xff1a; 0. 下载压缩包 访问Neo4j官网&#xff0c;找到 Community Edition 版本并选择 4.x 或者 5.x 下载&#xff1a;https://neo4j.com/deployme…

React状态管理之Zustand

React状态管理之Zustand 在React应用中&#xff0c;状态管理是一个核心问题。随着应用规模的扩大&#xff0c;组件间的数据传递和状态共享变得越来越复杂。为了解决这一问题&#xff0c;开发者们探索了多种状态管理方案&#xff0c;其中Zustand因其简洁、高效和易用性而逐渐受…

django-ninja 实现cors跨域请求

要在Django-Ninja项目中实现跨域&#xff08;CORS&#xff09;&#xff0c;你可以使用django-cors-headers库&#xff0c;这是一个专门用于处理跨域资源共享&#xff08;CORS&#xff09;问题的Django应用程序。以下是具体的步骤和配置&#xff1a; 安装依赖&#xff1a; 使用p…

uni-app快速入门(五)--判断运行环境及针对不同平台的条件编译

一、判断运行环境 在实际项目开发中&#xff0c;经常需要进行开发环境和生产环境的切换&#xff0c;uni-app可根据process.env.NODE_ENV判断当前运行环境是开发环境和生产环境&#xff0c;根据不同的环境调用不同的后台接口&#xff0c;具体实现方式: 在项目的static目录下建…

wireshark 基础

wireshark 基础 一、wireshark介绍 Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封包分析软件。网络封包分析软件的功能是捕获网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换…

Flutter网络通信-封装Dio

前言 dio 是一个强大的 Dart HTTP 请求库&#xff0c;支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 Dio的pub地址为&#xff1a;dio | Dart package 封装要求 能够使用get、post、put、patch、delete、…