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");
    else
        ui->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); //directoryChanged
    QObject::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); //directoryChanged
    QObject::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");
    else
        ui->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");
    else
        ui->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");
    else
        ui->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");
    else
        ui->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");
    else
        ui->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");
    else
        ui->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");
    else
        ui->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");
    else
        ui->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");
    else
        ui->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()
{//QTemporaryDir
    showBtnInfo(sender());

    QTemporaryDir    dir;
    dir.setAutoRemove(true);
    ui->plainTextEdit->appendPlainText(dir.path()+"\n");
}

void Dialog::on_pushButton_25_clicked()
{//QTemporaryFile
    showBtnInfo(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");
    else
        ui->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");
    else
        ui->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); //directoryChanged
    QObject::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); //directoryChanged
    QObject::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");
    else
        ui->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");

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络基础实战之路】基于三个分公司的内网搭建并连接运营商的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Qt应用开发(基础篇)——拆分器窗口 QSplitter

一、前言 QSplitter继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个基础工具类。 框架类QFrame介绍 QSplitter拆分器&#xff0c;用户通过拖动子部件之间的边界来控制子部件的大小&#xff0c;在应用开发中数据分模块展示、图片展示等场景下使用。 二、QSp…

适合大学生的兼职有什么?推荐四个靠谱的副业!

不知不觉新学期也要开始了&#xff0c;大学生们会不会因为苦恼的钱不够花而不够尽兴&#xff0c;很多大学生都想利用下课的时间来做一份兼职&#xff0c;但是有很多鉴于学校封校不知道自己可以做什么&#xff0c;我来为大家整理了以下几个大学生在学校内相对可靠的兼职。 第一个…

webpack复习

webpack webpack复习 webpack基本配置 拆分配置 - 公共配置 生产环境配置 开发环境配置 使用merge webpack-dev-server 启动本地服务 在公共中引入babel-loader处理es6 webpack高级配置 多入口文件 enty 入口为一个对象 里面的key为入口名 value为入口文件路径 例如 pa…

mac安装nvm管理工具遇到的问题和解决方法

nvm 是一款可以管理多版本node的工具&#xff0c;因为是刚买没多久的电脑之前用的都是windows&#xff0c;昨天折腾了一下午终于倒腾好了 第一步&#xff1a; 卸载电脑已有的node&#xff1b;访问nvm脚本网址&#xff0c;另存为到电脑上任何目录&#xff0c;我是放在桌面上的…

【音视频、chatGpt】h5页面最小化后,再激活后视频停住问题的解决

目录 现象 观察 解决 现象 页面有时候要切换&#xff0c;要最小化&#xff1b;短时间或者几个小时内切换回来&#xff0c;视频可以正常续上&#xff1b;而放置较长时间&#xff0c;几个小时或者一晚上&#xff0c;切换回来后&#xff0c;视频可能卡死 观察 切换页面&#x…

leetcode118. 119.杨辉三角

118 题目&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 思路&#xff1a; 可以发现从第三行开始&#xff0c;从第二个元素到倒数第二个元素&#xff0c;每个元素都…

TypeScript 关于对【泛型】的定义使用解读

目录 概念导读泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类总结&#xff1a; 概念导读 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型…

C#小轮子:Visual Studio自动编译Sass文件

文章目录 前言插件安装插件使用compilerconfig.jsonsass输入和css输出&#xff08;自动生成&#xff09;默认配置&#xff08;我不懂就不去动他了&#xff09; 前言 我们知道css文件用起来太麻烦&#xff0c;如果样式一多&#xff0c;嵌套起来用css样式就眼花缭乱。Sass使用层…

ElasticSearch:项目实战(1)

es环境搭建参考&#xff1a;ElasticSearch&#xff1a;环境搭建步骤_Success___的博客-CSDN博客 需求&#xff1a; 用户输入关键可搜索文章列表 关键词高亮显示 文章列表展示与home展示一样&#xff0c;当用户点击某一篇文章&#xff0c;可查看文章详情 思路&#xff1a; …

CSS-grid布局

网格布局也叫grid布局&#xff0c;平常写样式的时候基本上都是用的flex布局。 像以下布局&#xff0c;用flex布局就可能会有有点麻烦&#xff0c;这时候用grid布局就方便的多了。 或者是照片墙 grid布局就是将容器划分为行和列&#xff0c;产生单元格&#xff0c;然后在指定的…

ArcGIS Pro技术应用(暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合)

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

机器学习笔记之优化算法(十一)凸函数铺垫:梯度与方向导数

机器学习笔记之优化算法——凸函数铺垫&#xff1a;梯度与方向导数 引言回顾&#xff1a;偏导数方向余弦方向导数方向导数的几何意义方向导数的定义 方向导数与偏导数之间的关联关系证明过程 梯度 ( Gradient ) (\text{Gradient}) (Gradient) 引言 本节作为介绍凸函数的铺垫&a…

【华秋推荐】新能源汽车中的T-BOX系统,你了解多少?

近几年&#xff0c;新能源汽车产业进入了加速发展的阶段。我国的新能源汽车产业&#xff0c;经过多年的持续努力&#xff0c;技术水平显著提升、产业体系日趋完善、企业竞争力大幅增强&#xff0c;呈现市场规模、发展质量“双提升”的良好局面。同时&#xff0c;通过国家多年来…

IDEA每次启动indexing解决办法

每次启动indexing很浪费时间。 解决办法 setting中搜索index 设置如下&#xff1a; 这样设置以后&#xff0c;启动速度明显快多了。 参考 https://blog.csdn.net/qq_45162113/article/details/121128721

Leetcode24 两两交换链表相邻的节点

迭代解法&#xff1a; class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHead new ListNode(0);dummyHead.next head;ListNode temp dummyHead;while (temp.next ! null && temp.next.next ! null) {ListNode node1 temp.next;ListNode n…

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led&#xff0c;用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

树莓派安装Ubuntu系统(无屏幕)

树莓派安装ubuntu系统 前言 软件需要: 1.方案一 win32diskimager-1.0.0-install.exe SDFormatterha Ubuntu镜像&#xff08;可以官网下载也可以清华源&#xff09; 方案二: 树莓派镜像烧录器 树莓派镜像烧录器直达下载 硬件需要: 64GB内存卡&#xff08;推荐Sanddisk Ultra&am…

Java并发编程第4讲——Java中的锁(知识扫盲)

目录 一、锁的相关概念 1.1 什么是锁 1.2 为什么需要锁 1.3 Java中锁的分类 二、synchronized关键字 2.1 三个特点 2.2 三种表现形式&#xff08;&#x1f64b;‍♂️&#xff09; 2.3 sychronized是怎么实现的&#xff08;&#x1f64b;‍♂️&#xff09; 2.4 JDK1.…

用MariaDB创建数据库,SQL练习,MarialDB安装和使用

前言&#xff1a;MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。在存储引擎方面&#xff0c;使用XtraDB来代替MySQ…