【QT】文件目录操作

       

目录

1 文件目录操作相关的类

2 实例概述

2.1 实例功能

2.2 信号发射者信息的获取

3 QCoreApplication类

4 QFile类

5 QFilelnfo类

6 QDir类

7 QTemporaryDir和QTemporaryFiIe

8 QFiIeSystemWatcher类

       文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能。

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 信号发射者信息的获取

        每个按钮一般用函数名称作为标题,例如“QFileInfo类”分组里的按钮"baseName()”是要演示QFileInfo的baseName()函数。另外,将Qt帮助文件里的这个函数的基本描述文字复制作为 按钮的ToolTip文字,例如"baseName()"按钮的ToolTip属是“Returns the base name of the file  without the path”。
【QT】文件目录操作_第1张图片
        图7-3 实例samp7_3运行时窗口
        在按钮被单击时,先显示按钮的标题和ToolTip信息,以便明显地知道按钮演示的功能。例 如,"baseName()”按钮的clicked()槽函数代码如下:
 
void Dialog::on_pushButton_30_clicked()
{//QFileInfo.basename()
    QPushButton *btn = (QPushButton*) sender();
    ui->plainTextEdit->appendPlainText(btn->text());
    ui->plainTextEdit->appendPlainText(btn->toolTip());
    QFileInfo  fileInfo(ui->editFile->text());
    QString  str=fileInfo.baseName();
    ui->plainTextEdit->appendPlainText(str+"\n");
}

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

        这里用到了QObject::sender()函数,该函数用于在槽函数里获取发射信号的对象。因为这个函数是按钮的clicked()信号的槽函数,所以,sender()获取的信号发射对象就是这个按钮。然后将此对象转换为QPushButton类型变量btn,就可以访问btn的text()和toolTip()函数了。

        这种方法的优点是没有出现对象的ObjectName,这3行代码可以在任何一个按钮的clicked()信号槽函数里出现。如果是直接用按钮的ObjectName,则每个按钮里的代码里需要修改名称。本实例有几十个按钮,工作量很大,也容易遗漏了修改名称。

        对上面的代码还可以进一步优化,因为每个按钮的槽函数里都要重复这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(btn);
    ui->plainTextEdit->appendPlainText(theBtn->text());
    ui->plainTextEdit->appendPlainText(theBtn->toolTip()+"\n");
}
     在主窗口类中定义一个私有函数showBtnInfo(),接收QObject *btn对象作为输入参数,将 QObject对象转换为QPushButton对象,然后显示按钮的text和toolTip。
        在按钮的响应代码里只需用一行语句调用showBtnInfo()函数,并将sender()作为参数传递。
        本实例有几十个按钮,每个按钮的响应代码的第一行都是showBtnInfo(sender()),这样可以大 大简化代码。

3 QCoreApplication类

        QCoreApplication是为无GUI应用提供事件循环的类,是所有应用程序类的基类,其子类 QGuiApplication为有GUI界面的应用程序提供流控制和主要的设定,QGuiApplication的子类 QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等。
        创建的Qt Widget Application都是基于QApplication的,在main()函数里可以看到QApplication 的应用。
        QCoreApplication提供了一些有用的静态函数,可以获取应用程序的名称、启动路径等信息, 几个函数的名称和功能见表7-4(省略了函数参数中的const关键字) 。
【QT】文件目录操作_第2张图片

4 QFile类

        前面使用QFile类进行文件的操作,应用了QFile::open()函数。除了打开文件提供读写操作 外,QFile还有一些静态函数和成员函数用于文件操作。表7-5是QFile的一些静态函数(省略了 函数参数中的const关键字)。
【QT】文件目录操作_第3张图片
        静态函数是无需创建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关键字)。
【QT】文件目录操作_第4张图片
        创建QFile对象时可以在构造函数里指定文件名,也可以用setFileName()指定文件,但是文 件打开后不能再调用setFileName()函数。指定的文件作为QFile对象的当前文件,然后成员函数 copy()、rename()等都是基于当前文件的操作。

5 QFilelnfo类

        QFileInfo类的接口函数提供文件的各种信息。QFileInfo对象创建时可以指定一个文件名作为 当前文件,也可以用setFile()函数指定一个文件作为当前文件。
        QFileInfo常见接口函数和功能见表7-7。除了一个静态函数exists()之外,其他都是公共接口 函数,接口函数的操作都是针对当前文件(省略了函数参数中的const关键字)。
【QT】文件目录操作_第5张图片
        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");
}
        表7-7中的函数的使用方法和执行效果不再详细列举和说明,运行实例samp7_3观察执行结 果,可参考Qt帮助文件或samp7_3的源程序看函数使用方法。

6 QDir类

        QDir是进行目录操作的类,在创建QDir对象时传递一个目录字符串作为当前目录,然后QDir 函数就可以针对当前目录或目录下的文件进行操作。表7一8是QDir的一些静态函数(省略了函数 参数中的const关键字)。
        在使用QFileDialog选择打开一个文件或目录时需要传递一个初始目录,这个时候就可以使用 QDir::currentpath()获取应用程序当前目录作为初始目录,前面一些实例程序的代码中己经用到过 这个功能。
        表7-9是QDir的一些公共接口函数(省略了函数参数中的const关键字)。
【QT】文件目录操作_第6张图片
        获取目录下的目录或文件列表的函数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;iplainTextEdit->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;iplainTextEdit->appendPlainText(strList.at(i));
    ui->plainTextEdit->appendPlainText("\n");
}

7 QTemporaryDir和QTemporaryFiIe

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

8 QFiIeSystemWatcher类

        QFileSystemWatcher是对目录和文件进行监听的类。把某些目录或文件添加到QFileSystem Watcher对象的监听列表后,当目录下发生文件新建、删除等操作时会发射directoryChanged()信号, 当监听的文件发生修改、重命名等操作时,会发射fileChanged()信号。所以,这个类在进行目录 或文件监听时起作用。
        QFileSystemWatcher的主要接口函数见表7-11(省略了函数参数中的const关键字)。
【QT】文件目录操作_第7张图片
        QFileSystemWatcher有两个信号,分别是目录变化和文件变化时发射的信号。
void QFileSystemWatcher::directoryChanged(const QString &path)
void QFileSystemWatcher::fileChanged(const QString &path)
        图7-4是实例中测试QFileSystemWatcher的界面。首先打开一个目录和一个文件,单击 "addPath()开始监听”按钮将文件和目录都添加到监听列表,并且将信号与槽函数关联起来。然后在 目录下复制某个文件,会发射directoryChanged()信号,重命名所监听的文件后会发射fileChanged() 信号,如图7-4所示的运行结果。
【QT】文件目录操作_第8张图片
图7-4测试QFileSystemWatcher的运行界面
        为了测试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
          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()解除信号与槽的关联。

你可能感兴趣的:(Qt,qt,开发语言,文件目录操作)