07-3_Qt 5.9 C++开发指南_文件目录操作

文章目录

  • 1. 文件目录操作相关的类
  • 2. 实例概述
    • 2.1 实例功能
    • 2.2 信号发射信息的获取
  • 3. QCoreApplication 类
  • 4. QFile类
  • 5. QFileInfo类
  • 6. QDir类
  • 7. QTemporaryDir 和QTemporaryFile
  • 8. QFileSystemWatcher 类
  • 9. 框架和源码
    • 9.1 可视化UI设计
    • 9.2 dialog.cpp

1. 文件目录操作相关的类

Qt 为文件和目录操作提供了一些类,利用这些类可以方便地实现一些操作。Qt 提供的与文件和目录操作相关的类包括以下几个。
QCoreApplication:用于提取应用程序路径、程序名等文件信息

  • QFile: 除了打开文件操作外,QFile 还有复制文件、删除文件等功能

  • QFileInfo:用于提取文件的信息,包括路径、文件名、后缀等。

  • QDir: 用于提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件,文件重命名等操作。

  • QTemporaryDir和QTemporaryFile:用于创建临时目录和临时文件

  • QFileSystemWatcher: 文件和目录监听类,监听目录下文件的添加、删除等变化,监听文件修改变化。

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

2. 实例概述

2.1 实例功能

实例 samp7_3 演示前述各种目录与文件操作类的主要功能,图 7-3 是实例运行时的窗口。

在这里插入图片描述
窗口左侧是一个QToolBox 组件,分为6组,每一组是一个或两个类的功能演示,在每个组里放置些QPushButton 按钮,每个按钮主要调用类的某个函数,按钮的标题就是使用的函数的名称。

窗口右侧是显示区,可以选择一个目录、一个文件,然后左侧的功能基本上都是对选择的目录或文件进行操作,右下方是一个 QPlainTextEdit 组件,用于显示信息。

2.2 信号发射信息的获取

每个按钮一般用函数名称作为标题,例如“QFilelnfo 类”分组里的按钮“baseName()”是要演示 QFilelnfo 的 baseName()函数。另外,将 Qt 帮助文件里的这个函数的基本描述文字复制作为按钮的 ToolTip 文字,例如“baseName()”按钮的 ToolTip 属性是“Returns the base name of the filewithout the path”

在按钮被单击时,先显示按钮的标题和 TolTip 信息,以便明显地知道按钮演示的功能。例如,“baseName()”按钮的 clicked()槽函数代码如下:

void Dialog::on pushButton 30 clicked()
{//QFileInfo,basename()
QPushButton *btn = static cast<QPushButton*>(sender());
ui->plainTextEdit->appendPlainText (btn->text();
ui->plainTextEdit->appendplainText(btn->toolTip()+"\n");QFileInfo  fileInfo(ui->editFile->text());
QString str=fileInfo.baseName();
ui->plainTextEdit->appendPlainTextistr+"n");
}

代码的前 3 行是用于获取按钮对象,并显示按钮的 text 和 toolTip 文字。

这里用到了 QObject::sender()函数,该函数用于在槽函数里获取发射信号的对象。因为这个函数是按钮的 clicked()信号的槽函数,所以,sender()获取的信号发射对象就是这个按钮。然后将此对象转换为QPushButton 类型变量 btn,就可以访问 btn 的text()和 toolTip()函数了。
这种方法的优点是没有出现对象的 ObjectName,这3 行代码可以在任何一个按钮的 clicked()信号槽函数里出现。如果是直接用按钮的 ObiectName,则每个按钮里的代码里需要修改名称。本实例有几十个按钮,工作量很大,也容易遗漏了修改名称。
对上面的代码还可以进一步优化,因为每个按钮的槽函数里都要重复这 3 行代码,将其编写为一个函数,然后在按钮的响应代码里调用。优化后的代码如下:

void Dialog::on_pushButton_30_clicked()
{//QFileInfo.basename()showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.baseName();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::showBtnInfo(QObject *btn)
{ //显示btn的信息QPushButton *theBtn =static_cast<QPushButton*>(btn);ui->plainTextEdit->appendPlainText(theBtn->text());ui->plainTextEdit->appendPlainText(theBtn->toolTip()+"\n");
}

在主窗口类中定义一个私有函数 showBtnInfo(),接收 QObject *btn 对象作为输入参数,将
QObject 对象转换为QPushButton 对象,然后显示按钮的 text和 toolTip。

在按钮的响应代码里只需用一行语句调用 showBtnInfo()函数,并将 sender()作为参数传递。

本实例有几十个按钮,每个按钮的响应代码的第一行都是 showBtnInfo(sender0),这样可以大大简化代码。

3. QCoreApplication 类

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

创建的Qt Widget Application 都是基于QApplication 的,在main()函数里可以看到QApplication的应用。
QCoreApplication 提供了一些有用的静态函数,可以获取应用程序的名称、启动路径等信息,几个函数的名称和功能见表 7-4(省略了函数参数中的 const 关键字)。

在这里插入图片描述

4. QFile类

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

在这里插入图片描述

静态函数是无需创建 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 还提供了对应的成员函数,见表 7-6(省略了函数参数中的 const 关键字)。

在这里插入图片描述

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

5. QFileInfo类

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

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

在这里插入图片描述

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

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");
}

表 7-7 中的函数的使用方法和执行效果不再详细列举和说明,运行实例 samp7_3 观察执行结果,可参考 Qt 帮助文件或 samp7_3 的源程序看函数使用方法。

6. QDir类

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

在这里插入图片描述
在这里插入图片描述
在使用 QFileDialog 选择打开一个文件或目录时需要传递一个初始目录,这个时候就可以使用QDir:: currentPath()获取应用程序当前目录作为初始目录,前面一些实例程序的代码中已经用到过这个功能。
表 7-9 是 QDir 的一些公共接口函数(省略了函数参数中的 const 关键字)。

在这里插入图片描述

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

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

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

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");
}

7. QTemporaryDir 和QTemporaryFile

QTemporaryDir 是用于创建、删除临时目录的类,其主要函数见表 7-10。

在这里插入图片描述

在系统临时目录,即 QDir::tepPath 目录下创建一个临时目录,临时目录名称以QCoreApplication::applicationName()为前缀,后加 6个字符。临时目录可以设置为使用完后自动删除,即临时目录变量删除时,临时目录也删除。
QTemporaryFile 是用于创建临时文件的类,临时文件保存在系统临时目录下。临时文件以QCoreApplication::applicationName()作为文件名,以“XXXXXX”6个随机数字作为文件后缀。将QTemporaryFile::setAutoRemove()函数设置为是否自动删除临时文件,QTemporaryFile::open()函数用于打开临时文件,只有打开临时文件,才实际创建了此文件。

8. QFileSystemWatcher 类

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

QFileSystemWatcher 的主要接口函数见表 7-11(省略了函数参数中的 const 关键字)。

在这里插入图片描述

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

[signal] void QFileSystemWatcher::directoryChanged(const QString &path)
[signal] void QFileSystemWatcher::fileChanged(const QString &path)

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

在这里插入图片描述

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

private:QFileSystemWatcher  fileWatcher;
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");
}

图7-4中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()解除信号与槽的关联。

9. 框架和源码

9.1 可视化UI设计

在这里插入图片描述

9.2 dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"#include    <QFileDialog>
#include    <QDateTime>
#include    <QTemporaryDir>
#include    <QTemporaryFile>void Dialog::showBtnInfo(QObject *btn)
{ //显示btn的信息QPushButton *theBtn =static_cast<QPushButton*>(btn);ui->plainTextEdit->appendPlainText(theBtn->text());ui->plainTextEdit->appendPlainText(theBtn->toolTip()+"\n");
}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");
}Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);this->setWindowFlags(Qt::Window);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_pushButton_clicked()
{showBtnInfo(sender());QString str=QCoreApplication::applicationDirPath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_2_clicked()
{showBtnInfo(sender());QString str=QCoreApplication::applicationFilePath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_3_clicked()
{showBtnInfo(sender());QString str=QCoreApplication::applicationName();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_4_clicked()
{showBtnInfo(sender());QStringList strList=QCoreApplication::libraryPaths();for (int i=0;i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i));ui->plainTextEdit->appendPlainText("");
}void Dialog::on_pushButton_5_clicked()
{ui->plainTextEdit->clear();
}void Dialog::on_pushButton_41_clicked()
{//打开文件QString curDir=QDir::currentPath();QString aFile=QFileDialog::getOpenFileName(this,"打开一个文件",curDir,"所有文件(*.*)");ui->editFile->setText(aFile);
}void Dialog::on_pushButton_45_clicked()
{QString curDir=QDir::currentPath();QString aDir=QFileDialog::getExistingDirectory(this,"选择一个目录",curDir,QFileDialog::ShowDirsOnly);ui->editDir->setText(aDir);
}void Dialog::on_pushButton_28_clicked()
{//QFileInfo::absoluteFilePath()showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.absoluteFilePath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_29_clicked()
{//QFileInfo::absolutePath()showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.absolutePath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_30_clicked()
{//QFileInfo.basename()showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.baseName();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_31_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.completeBaseName();ui->plainTextEdit->appendPlainText(str+"\n");}void Dialog::on_pushButton_32_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.completeSuffix();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_27_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());bool  the=fileInfo.exists();if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");
}void Dialog::on_pushButton_39_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.suffix();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_33_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.fileName();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_34_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.filePath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_42_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editDir->text());bool  the=fileInfo.isDir();if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");
}void Dialog::on_pushButton_43_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());bool  the=fileInfo.isFile();if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");
}void Dialog::on_pushButton_35_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());bool  the=fileInfo.isExecutable();if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");
}void Dialog::on_pushButton_37_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QString  str=fileInfo.path();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_36_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QDateTime  dt=fileInfo.lastModified();QString  str=dt.toString("yyyy-MM-dd hh:mm:ss");ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_44_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QDateTime  dt=fileInfo.lastRead();QString  str=dt.toString("yyyy-MM-dd hh:mm:ss");ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_38_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());qint64  dt=fileInfo.size();QString  str=QString("%1 Bytes").arg(dt);ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_10_clicked()
{showBtnInfo(sender());QString  str=QDir::tempPath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_9_clicked()
{showBtnInfo(sender());QString  str=QDir::rootPath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_8_clicked()
{showBtnInfo(sender());QString  str=QDir::homePath();ui->plainTextEdit->appendPlainText(str+"\n");}void Dialog::on_pushButton_6_clicked()
{showBtnInfo(sender());QString  str=QDir::currentPath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_7_clicked()
{showBtnInfo(sender());QFileInfoList  strList=QDir::drives();for(int i=0;i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i).path());ui->plainTextEdit->appendPlainText("\n");}void Dialog::on_pushButton_13_clicked()
{//absoluteFilePath(),showBtnInfo(sender());QDir    dir(ui->editDir->text());QString  str=dir.absoluteFilePath(ui->editFile->text());ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_14_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());QString  str=dir.absolutePath();ui->plainTextEdit->appendPlainText(str+"\n");}void Dialog::on_pushButton_15_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());QString  str=dir.canonicalPath();ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_19_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());QString  str=dir.filePath(ui->editFile->text());ui->plainTextEdit->appendPlainText(str+"\n");}void Dialog::on_pushButton_16_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());QString  str=dir.dirName();ui->plainTextEdit->appendPlainText(str+"\n");
}
void Dialog::on_pushButton_18_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());bool  the=dir.exists();if (the)ui->plainTextEdit->appendPlainText("true \n");elseui->plainTextEdit->appendPlainText("false \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");
}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_24_clicked()
{showBtnInfo(sender());QString sous(ui->editDir->text());QDir    dir(sous);bool   ok=dir.rmdir(sous);if (ok)ui->plainTextEdit->appendPlainText("成功删除所选目录\n"+sous+"\n");elseui->plainTextEdit->appendPlainText("删除失败\n");
}void Dialog::on_pushButton_20_clicked()
{showBtnInfo(sender());QString subDir="subdir1";QDir    dir(ui->editDir->text());bool   ok=dir.mkdir(subDir);if (ok)ui->plainTextEdit->appendPlainText("所选目录下成功新建一个目录 "+subDir+"\n");elseui->plainTextEdit->appendPlainText("创建目录失败\n");
}void Dialog::on_pushButton_26_clicked()
{showBtnInfo(sender());QString curDir=QDir::currentPath();QDir    lastDir(curDir);ui->plainTextEdit->appendPlainText("选择目录之前:"+lastDir.absolutePath());QString aDir=QFileDialog::getExistingDirectory(this,"选择一个目录",curDir,QFileDialog::ShowDirsOnly);if (aDir.isEmpty())return;ui->editDir->setText(aDir);lastDir.setPath(aDir);ui->plainTextEdit->appendPlainText("选择目录之后:"+lastDir.absolutePath()+"\n");
}void Dialog::on_pushButton_22_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());QString sous(ui->editFile->text());bool ok= dir.remove(sous);if (ok)ui->plainTextEdit->appendPlainText("删除文件:"+sous+"\n");elseui->plainTextEdit->appendPlainText("删除文件失败\n");
}void Dialog::on_pushButton_12_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());bool ok= dir.removeRecursively();if (ok)ui->plainTextEdit->appendPlainText("删除目录及文件成功\n");elseui->plainTextEdit->appendPlainText("删除目录及文件失败\n");
}void Dialog::on_pushButton_23_clicked()
{showBtnInfo(sender());QDir    dir(ui->editDir->text());QString sous=ui->editFile->text(); //源文件QFileInfo   fileInfo(sous);//QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ";dir.rename(sous,newFile);ui->plainTextEdit->appendPlainText("源文件:"+sous);ui->plainTextEdit->appendPlainText("重命名为:"+newFile+"\n");
}void Dialog::on_pushButton_21_clicked()
{//QTemporaryDirshowBtnInfo(sender());QTemporaryDir    dir;dir.setAutoRemove(true);ui->plainTextEdit->appendPlainText(dir.path()+"\n");
}void Dialog::on_pushButton_25_clicked()
{//QTemporaryFileshowBtnInfo(sender());QTemporaryFile    aFile;aFile.setAutoRemove(true);aFile.open();ui->plainTextEdit->appendPlainText(aFile.fileName()+"\n");
}void Dialog::on_pushButton_40_clicked()
{QCoreApplication::exit();
}void Dialog::on_pushButton_48_clicked()
{showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFileInfo   fileInfo(sous);//QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+"--副本."+fileInfo.suffix();QFile::copy(sous,newFile);ui->plainTextEdit->appendPlainText("源文件:"+sous);ui->plainTextEdit->appendPlainText("复制为文件:"+newFile+"\n");
}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");
}void Dialog::on_pushButton_54_clicked()
{showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFile   file(sous);bool the=file.exists();if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");
}void Dialog::on_pushButton_53_clicked()
{showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFile   file(sous);QFileInfo   fileInfo(sous);//QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+"--副本."+fileInfo.suffix();file.copy(newFile);ui->plainTextEdit->appendPlainText("源文件:"+sous);ui->plainTextEdit->appendPlainText("复制为文件:"+newFile+"\n");
}void Dialog::on_pushButton_49_clicked()
{showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFile::remove(sous);ui->plainTextEdit->appendPlainText("删除文件:"+sous+"\n");
}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");
}void Dialog::on_pushButton_55_clicked()
{showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFile   file(sous);file.remove();ui->plainTextEdit->appendPlainText("删除文件:"+sous+"\n");
}void Dialog::on_pushButton_56_clicked()
{//QFile.rename()showBtnInfo(sender());QString sous=ui->editFile->text(); //源文件QFile   file(sous); //源文件对象QFileInfo   fileInfo(sous);//源文件信息QString newFile=fileInfo.path()+"/"+fileInfo.baseName()+".XYZ"; //修改文件后缀为“.XYZ”file.rename(newFile); //重命名文件ui->plainTextEdit->appendPlainText("源文件:"+sous);ui->plainTextEdit->appendPlainText("重命名为:"+newFile+"\n");
}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
}void Dialog::on_pushButton_52_clicked()
{//显示监听目录,directories()showBtnInfo(sender());QStringList strList=fileWatcher.directories();for (int i=0; i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i));ui->plainTextEdit->appendPlainText("");}void Dialog::on_pushButton_57_clicked()
{//显示监听文件,files()showBtnInfo(sender());QStringList strList=fileWatcher.files();for (int i=0; i<strList.count();i++)ui->plainTextEdit->appendPlainText(strList.at(i));ui->plainTextEdit->appendPlainText("");}void Dialog::on_pushButton_59_clicked()
{showBtnInfo(sender());bool  the=QFileInfo::exists(ui->editFile->text());if(the)ui->plainTextEdit->appendPlainText(+"true \n");elseui->plainTextEdit->appendPlainText(+"false \n");}void Dialog::on_pushButton_58_clicked()
{showBtnInfo(sender());QFileInfo  fileInfo(ui->editFile->text());QDateTime  dt=fileInfo.created();QString  str=dt.toString("yyyy-MM-dd hh:mm:ss");ui->plainTextEdit->appendPlainText(str+"\n");
}void Dialog::on_pushButton_60_clicked()
{showBtnInfo(sender());QDir::setCurrent(ui->editDir->text());QString  str=QDir::currentPath();ui->editDir->setText(str);ui->plainTextEdit->appendPlainText("设置当前路径为:"+str+"\n");
}void Dialog::on_pushButton_61_clicked()
{showBtnInfo(sender());QString str=QCoreApplication::organizationName();ui->plainTextEdit->appendPlainText(str+"\n");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpRunner搭建接口自动化测试项目

前言&#xff1a;前面写过一篇PytestAllure接口自动化测试框架搭建的博客&#xff0c;这篇博客学习另外一款优秀的开源的接口自动化测试框架&#xff1a;HttpRunner&#xff0c;本博客主要学习如何搭建基于HttpRunner的接口自动化测试项目 PytestAllure接口自动化测试框架搭建…

【刷题笔记8.9】LeetCode题目:两数相加

LeetCode题目2&#xff1a;两数相加 题目及描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设…

Linux 常用操作命令

Linux简介及Ubuntu安装 Linux&#xff0c;免费开源&#xff0c;多用户多任务系统。基于Linux有多个版本的衍生。RedHat、Ubuntu、Debian 安装VMware或VirtualBox虚拟机。具体安装步骤&#xff0c;找百度。 再安装Ubuntu。具体安装步骤&#xff0c;找百度。 常用指令 ls  …

国际货币汇率 API 数据接口

国际货币汇率 API 数据接口 支持多种货币对&#xff0c;每日精准汇率&#xff0c;多币种支持。 1. 产品功能 支持多种货币汇率查询&#xff1b;支持部分加密货币汇率查询&#xff1b;数据为每日更新汇率数据&#xff1b;可一次查询源货币代码对应所有目标货币汇率&#xff1b…

LinuxC编程——进程

目录 一、概念1.1 程序1.2 进程 二、特点⭐⭐⭐三、进程段四、进程分类五、进程状态六、进程状态转换图七、函数接口1. 创建子进程2. 回收进程资源3. 退出进程4. 获取进程号 八、守护进程 一、概念 进程和程序是密不可分的两组概念&#xff0c;相对比&#xff0c;便于理解。 1.…

2023年,App运行小游戏,可以玩出什么创意?

疫情过后&#xff0c;一地鸡毛。游戏行业的日子也不好过。来看看移动游戏收入&#xff1a;2022年&#xff0c;移动游戏收入达到920亿美元&#xff0c;同比下降6.4%。这告诉我们&#xff0c;2022年对移动游戏市场来说是一个小挫折。 但不管是下挫还是上升&#xff0c;移动游戏市…

你见过的这里都有,开源Web性能测试工具集合

你见过的这里都有&#xff0c;开源Web性能测试工具集合&#xff1a; 1、JMeter。这个也不用多介绍&#xff0c;基本属于做过Web性能测试都会接触的工具。Apache旗下的开源项目&#xff0c;属于一个Java桌面应用程序。优势是开源免费&#xff0c;扩展能力强。自身性能是硬伤。 …

数据库活动监控(DAM)

在当今数据驱动的世界中&#xff0c;组织在保护存储在数据库中的机密数据并确保其完整性方面面临着越来越多的挑战。数据库审计通过提供全面的数据库活动监控方法&#xff0c;在应对这些挑战方面发挥着至关重要的作用。 数据库活动监控&#xff08;Database Activity Monitori…

AI语音工牌在通讯行业营业大厅场景应用

在运营商营业大厅中&#xff0c;每天都有大量的客户来访咨询、办理业务。同时也会经常产生大量的客诉纠纷和服务差评。但因为缺乏有效的管理工具&#xff0c;加上线下沟通场景的数据采集难度高&#xff0c;数字化程度低&#xff0c;管理一直处于盲区。如何有效的管控营业厅人员…

【Spring专题】Spring之Bean的生命周期源码解析——上(扫描生成BeanDefinition)

目录 前言阅读指引阅读建议 课程内容一、生成BeanDefinition1.1 简单回顾1.2 概念回顾1.3 核心方法讲解 二、方法讲解2.1 ClassPathBeanDefinitionScanner#scan2.2 ClassPathBeanDefinitionScanner#doScan2.3 ClassPathScanningCandidateComponentProvider#findCandidateCompon…

面试热题(环形链表II)

给定一个链表&#xff0c;返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环&#xff0c;则返回 null。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引…

STM32CubeMX+VSCODE+EIDE+RT-THREAD 工程创建

Eide环境搭建暂且不表&#xff0c;后续补充。主要记录下Vscode环境下 创建Rt-thread工程的过程。分别介绍STM32CubeMX添加rtt支持包的方式和手动添加rtt kernel方式。STM32CubeMX生成工程的时候有"坑"&#xff0c;防止下次忘记&#xff0c;方便渡一下有缘人&#xff…

MyCat配置rule.xml、server.xml讲解

1. rule.xml分片规则配置文件 rule.xml中配置的主要就是拆分表的规则&#xff0c;rule.xml中主要包含两类标签 tableRule 和Function。 tableRule标签里面主要配置我们的分片规则&#xff0c;Function里面涉及的是分片规则里面所涉及的java类&#xff0c;都是在function中配置…

OI易问卷协助企业服务好员工,收集员工反馈与信息

OI易问卷——企业问卷调查工具 OI易问卷&#xff0c;是群硕专为企业打造&#xff0c;对内服务员工的调查问卷。 集成于办公联合创新平台&#xff0c;并进一步帮助客户实现与微信或企业微信等其他平台的对接。 可以有效促进员工服务数字化&#xff0c;提高各部门工作效率&…

中介者模式(C++)

定义 用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖)&#xff0c;从而使其耦合松散(管理变化)&#xff0c;而且可以独立地改变它们之间的交互。 应用场景 在软件构建过程中&#xff0c;经常会出现多个对象…

C#实现三菱FX-3U SerialOverTcp

设备信息 测试结果 D值测试 Y值写入后读取测试 协议解析 三菱FX 3U系列PLC的通信协议 1. 每次给PLC发送指令后&#xff0c;必须等待PLC的应答完成才能发送下一条指令; 2. 报文都是十六进制ASCII码的形式 3. 相关指令 指令 命令码&#xff08;ASCII码&#xff09; 操作原件 …

Selenium的xpath高级写法-实用篇

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录 系列文章目录前言获取父级获取前一个兄弟级获取后一个兄弟级获取内容包含某些内容获取内容是空消除不可见的内容 前言 获取父级 //div[text()‘我是子级’]/parent::div[text()‘我是父级’] 获取…

06 - Stream如何提高遍历集合效率?

前面我们讲过 List 集合类&#xff0c;那我想你一定也知道集合的顶端接口 Collection。 在 Java8 中&#xff0c;Collection 新增了两个流方法&#xff0c;分别是 Stream() 和 parallelStream()。 1、什么是 Stream&#xff1f; 现在很多大数据量系统中都存在分表分库的情况…

vue3部署宝塔后请求接口404以及刷新页面404的问题解决方案

技术&#xff1a;vue3.2.13 UI框架:element-plus 2.1.1 服务器&#xff1a;腾讯云Centos系统宝塔面板 Nginx:1.22.1 前提&#xff1a;宝塔面板》网站PHP项目 已经新建了项目 1.处理vue页面刷新报错404 如上图&#xff0c;在PHP网站》设置》配置文件&#xff0c;新增如下代码…

springboot 多模块 每个模块进行单独打包

springboot项目目录结构 打包模块需要进行的配置 配置文件引入打包插件 <build><finalName>api</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifac…