百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

从零开始学Qt(55):文件目录操作大全

liebian365 2024-11-05 11:50 3 浏览 0 评论

文件目录操作相关的类

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

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

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

QCoreApplication类

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

创建的Qt Widget Application都是基于QApplication的,在main()函数里可以看到 QApplication的应用。

QCoreApplication提供了一些有用的静态函数,可以获取应用程序的名称、启动路径等信息, 几个函数的名称和功能如下 (省略了函数参数中的const关键字)。

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

QFile类

前面使用QFile类进行文件的操作,应用了QFile::open()函数。除了打开文件提供读写操作 外,QFile还有一些静态函数和成员函数用于文件操作。下面是QFile的一些静态函数(省略了函数参数中的const关键字)。

  • bool copy(QString &fileName, QString &newName):复制文件
  • bool rename(QString &oldName, QString &newName):重命名文件
  • bool remove(QString &fileName):删除文件
  • bool exists(QString &fileName):判断文件是否存在
  • bool setPermissions(QString &fileName, Permissions permissions):设置文件的权限,权限类型是枚举类型QFileDevice::Permission
  • Permissions permissions(QString &fileName):返回文件的权限

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

void MainWindow::on_pushButton_clicked()
{// QFile: :exists ()判断文件是否存在
  QString sous=ui->editFile->text () ; //源文件
  bool the=QFile::exists(sous);
  if (the)
  	ui->plainTextEdit->appendPlainText(+"true \n");
  else
  	ui->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()等都是基于当前文件的操作。

QFilelnfo类

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

QFilelnfo常见接口函数和功能如下所示。除了一个静态函数exists()之外,其他都是公共接口函数,接口函数的操作都是针对当前文件(省略了函数参数中的const关键字)。

  • void setFile(QString &name):设置一个文件名,作为QFilelnfo操作的文件
  • 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():判断当前文件是否是可执行文件
  • QDateTime created():返回文件创建时间
  • QDateTime lastModified():返回文件最后一次被修改的时间
  • QDateTime lastRead():返回文件最后一次被读取的时间
  • bool exists():判断文件是否存在
  • bool exists(QString &file) :静态函数,判断file表示的文件是否存在

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

void MainWindow::on_pushButton_2_clicked()
{  //QFile::rename()
  QString sous=ui->editFile->text () ; //源文件
  QFileInfo fileInfo (sous) ; //源文件信息
  QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ";
  QFile::rename(sous, newFile);//重命名文件,更改后缀名
}

QDir类

QDir是进行目录操作的类,在创建QDir对象时传递一个目录字符串作为当前目录,然后QDir 函数就可以针对当前目录或目录下的文件进行操作。下面是QDir的一些静态函数(省略了函数参数中的const关键字)。

  • QString tempPath():返回临时文件目录名称
  • QString rootPath():返回根目录名称
  • QString homePath():返回主目录名称
  • QString currentPath():返回当前目录名称
  • bool setCurrent(QString &path) :设置path表示的目录为当前目录
  • QFilelnfoList drives(): 返回系统的根目录列表,在Windows系统上返回的是盘符列表

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

下面是QDir的一些公共接口函数(省略了函数参数中的const关键字)。

  • QString absoluteFilePath(QString &fileName):返回当前目录下的一个文件的含绝对路径文件名
  • QString absolutePath():返回当前目录的绝对路径
  • QString canonicalPath():返回当前目录的标准路径
  • QString filePath(QString &fileName) :返回目录下一个文件的目录名
  • QString dirName():返回最后一级目录的名称
  • bool exists():判断当前目录是否存在
  • QStringList entryList(Filters filters = NoFilter, SortFlags sort =NoSort) :返回目录下的所有文件名、子目录名等
  • bool mkdir(QString &dirName):在当前目录下建一个名称为dirName的子目录
  • bool rmdir(QString &dirName) :删除指定的目录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 MainWindow::on_pushButton_3_clicked()
{//列出子目录
  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 MainWindow::on_pushButton_4_clicked()
{//列出所有文件
  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()作为文件名,以“XXXXXX” 6个随机数字作为文件后缀。将QTemporaryFile::setAutoRemove()函数设置为是否自动删除临时文件,QTemporaryFile:: open()函数用于打开临时文件,只有打开临时文件,才实际创建了此文件。

QFileSystemWatcher类

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

QFileSystemWatcher的主要接口函数如下所示 (省略了函数参数中的const关键字)。

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

QFileSystemWatcher有两个信号,分别是目录变化和文件变化时发射的信号。

  • void QFileSystemWatcher::directoryChanged(const QString &path)
  • void QFileSystemWatcher::fileChanged(const QString &path)

图中是实例中测试QFileSystemWatcher的界面。首先打开一个目录和一个文件,单击 “addPath开始监听”按钮将文件和目录都添加到监听列表,并且将信号与槽函数关联起来。然后在目录下复制某个文件,会发射directoryChanged()信号,重命名所监听的文件后会发射fileChanged()信号,如图所示的运行结果。

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

private:
	QFileSystemWatcher fileWatcher;
public slots:
	void on_directoryChanged(const QString path);
	void on_fileChanged(const QString path);

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

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

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

void MainWindow::on_pushButton_5_clicked()
{//开始监听
  ui->plainTextEdit->appendPlainText("监听目录:"+ui->editDir->text () +"\n");
  fileWatcher.addPath(ui->editDir->text ());//添力口监听目录
  fileWatcher.addPath(ui->editFile->text ());//添力口监听文件
  QObject::connect(&fileWatcher,&QFileSystemWatcher::directoryChanged,
  	this,&MainWindow::on_directoryChanged); //directoryChanged
  QObject::connect(&fileWatcher,&QFileSystemWatcher::fileChanged,
  	this,&MainWindow::on_fileChanged); //fileChanged
}
void MainWindow::on_pushButton_6_clicked()
{//停止监听
  ui->plainTextEdit->appendPlainText("停止监听:"+ui->editDir->text()+"\n");
  fileWatcher.removePath(ui->editDir->text());
  fileWatcher.removePath(ui->editFile->text());
  QObject::disconnect(&fileWatcher,&QFileSystemWatcher::directoryChanged,
  	this,&MainWindow::on_directoryChanged); //directoryChanged
  QObject::disconnect(&fileWatcher,&QFileSystemWatcher::fileChanged,
  	this,&MainWindow::on_fileChanged); //fileChanged
}

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

停止监听时,用removePath()函数移除监听的目录和文件,并用disconnect()解除信号与槽的关联。

相关推荐

快递查询教程,批量查询物流,一键管理快递

作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...

一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递

对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...

快递查询单号查询,怎么查物流到哪了

输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...

3分钟查询物流,教你一键批量查询全部物流信息

很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...

快递单号查询,一次性查询全部物流信息

现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...

快递查询工具,批量查询多个快递快递单号的物流状态、签收时间

最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...

快递查询软件,自动识别查询快递单号查询方法

当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...

教你怎样查询快递查询单号并保存物流信息

商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...

简单几步骤查询所有快递物流信息

在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...

物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号

最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...

连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息

快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...

快递查询教程,快递单号查询,筛选更新量为1的单号

最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...

掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析

在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...

从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息

在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...

物流单号查询,在哪里查询快递

如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...

取消回复欢迎 发表评论: