监视文件状态-Qt有绝招

简介: 监视文件状态-Qt有绝招

在项目开发中,经常会遇到这样的问题:


当外部文件或文件夹被修改了,主程序如何马上知道文件已经被修改了呢?


一般情况,第一反应就是在程序中加入定时器,再约定时间间隔,定时检测文件状态,如果发现文件已经被修改,则发出信号,通知程序作相应处理。


但是,这样做很繁琐,不简洁,并且也比较耗性能,今天小豆君就来介绍下Qt是如何处理这种情况的。


下面,是我们的QFileSystemWatcher出场的时候了,哈,一看名字就很让人印象深刻,直接中式翻译“文件系统监视器”,顾名思义,就是监视文件系统变化的一个“小机器”。


那么,我们再来看一下这个类是继承谁的



喝,直接就是QObject,并且这家伙属性也没有。


那么,我们再看一下它的信号吧


目录改变信号,文件改变信号,参数分别是各自的路径。这货原来也可以监视目录变化,真是够周到的


下面小豆君只讲文件的,对于文件夹大家类比即可。


那么,我该如何监视文件变化呢,你可以直接调用addPath()方法添加需要监视的文件,再调用connect函数连接fileChanged()信号和自定义槽,那么当文件发生变化时,就可以采取动作了,就是这么简单。


那有的小伙伴又要问了,那如果要监视多个文件呢,简单,Qt已经为你想好了,你可以直接调用addPaths()添加多个,或者重复调用addPath(),记住,一次性添加多个路径的函数只多了个s哦。


如果想要知道监视器都监视了哪些文件,调用files()即可。


好的,下面我们就写个小例子来看看怎么用吧。


参照下方ui图,本例可以在窗口左侧添加多个需要监视的文本文件,当文本文件被修改后,右侧显示修改后的文本内容


新建GUI应用程序项目FileWatcher,ui窗口类名FileWatcherWidget。


ui界面如下(左侧为QListWidget,右侧为QTextEdit):



filewatcherwidget.h

#ifndef FILEWATCHERWIDGET_H
#define FILEWATCHERWIDGET_H
#include <QWidget>
#include <QFileSystemWatcher>
namespace Ui {
class FileWatcherWidget;
}
class FileWatcherWidget : public QWidget
{
    Q_OBJECT
public:
    explicit FileWatcherWidget(QWidget *parent = 0);
    ~FileWatcherWidget();
private slots:
    //点击添加按钮,添加要监视的文件
    void on_btn_add_clicked();
    //点击删除按钮,删除不需要监视的文件
    void on_btn_del_clicked();
    //当监视的文本文件发生变化时,
    //读取文本内容,并更新到右侧文本编辑器中
    void onFileChanged(const QString& path);
private:
    Ui::FileWatcherWidget *ui;
    QFileSystemWatcher* watcher;//监视器指针
};
#endif // FILEWATCHERWIDGET_H


filewatcherwidget.cpp

#include <QFileDialog>
#include <QFile>
#include "filewatcherwidget.h"
#include "ui_filewatcherwidget.h"
FileWatcherWidget::FileWatcherWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FileWatcherWidget)
{
    ui->setupUi(this);
    watcher = new QFileSystemWatcher(this);
    connect(watcher, SIGNAL(fileChanged(QString)),
            this, SLOT(onFileChanged(QString)));
}
FileWatcherWidget::~FileWatcherWidget()
{
    delete ui;
}
void FileWatcherWidget::on_btn_add_clicked()
{
    //打开txt文本文件
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                    "./",
                                                    tr("Text (*.txt)"));
    if (!fileName.isEmpty())
    {
        if (watcher->addPath(fileName))
        {
            //将文件路径添加到列表控件中
            ui->listWidget->addItem(fileName);
        }
    }
}
void FileWatcherWidget::on_btn_del_clicked()
{
    QListWidgetItem* item = ui->listWidget->currentItem();
    if (item)
    {
        if (watcher->removePath(item->text()))
        {
            delete item;
        }
    }
}
void FileWatcherWidget::onFileChanged(const QString &path)
{
    QFile file(path);
    if (file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        QString text(file.readAll());
        ui->textEdit->setText(text);
        file.close();
    }
}


然后编译运行程序,添加监视的文件,并修改保存文件,文本框中将会自动同步已经修改了的文件。


嘻嘻,不错吧,是不是Qt很给力,而且就几行代码就可以实现了。一般情况下,这种监视系统,经常会用到配置文件中,如果配置文件更改了,那程序就会去自动根据配置去更新程序或更新界面啦。


但是有一点要注意,如果被监视的文件被修改名字或删除,监视就会自动中断啦。


更多分享请关注微信公众号:小豆君Qt分享,只要关注,便可加入C++\Qt交流群,一起学习,更可获得所有文章源码。

相关文章
西门子S7-1200程序状态监视,监视表格的使用方法,如何使用交叉引用列表
本篇我们来学习西门子S7-1200程序状态监视、监视表格、交叉引用的使用方法。
西门子S7-1200程序状态监视,监视表格的使用方法,如何使用交叉引用列表
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
QT软件开发: QPlainTextEdit当做日志显示窗口
QT软件开发: QPlainTextEdit当做日志显示窗口
689 0
QT软件开发: QPlainTextEdit当做日志显示窗口
|
3月前
|
监控 C++
C++ Qt开发:QFileSystemWatcher文件监视组件
QFileSystemWatcher 是 Qt 框架中提供的一个类,用于监视文件系统中的文件和目录的变化。它允许你在文件或目录发生变化时接收通知,并可以用于监视文件的创建、删除、重命名以及内容修改等操作。这对于需要实时监控文件系统变化的应用程序是非常有用的。
111 5
C++ Qt开发:QFileSystemWatcher文件监视组件
|
3月前
|
监控 安全 API
7.3 Windows驱动开发:内核监视LoadImage映像回调
在笔者上一篇文章`《内核注册并监控对象回调》`介绍了如何运用`ObRegisterCallbacks`注册`进程与线程`回调,并通过该回调实现了`拦截`指定进行运行的效果,本章`LyShark`将带大家继续探索一个新的回调注册函数,`PsSetLoadImageNotifyRoutine`常用于注册`LoadImage`映像监视,当有模块被系统加载时则可以第一时间获取到加载模块信息,需要注意的是该回调函数内无法进行拦截,如需要拦截则需写入返回指令这部分内容将在下一章进行讲解,本章将主要实现对模块的监视功能。
77 0
7.3 Windows驱动开发:内核监视LoadImage映像回调
西门子S7-200 SMART PID回路控制,如何创建状态图表,下载并测试程序
上篇文章中我们学习了调用向导生成的子程序编程来实现西门子S7-200 SMART PID回路控制,今天我们来学习如何创建状态图表并利用状态图表来测试程序。首先我们来看一下如何创建状态图表。
西门子S7-200 SMART PID回路控制,如何创建状态图表,下载并测试程序
关于 qt程序退出出现“已停止工作”程序奔溃问题 的解决方法
关于 qt程序退出出现“已停止工作”程序奔溃问题 的解决方法
关于 qt程序退出出现“已停止工作”程序奔溃问题 的解决方法
Qt 独立运行时伴随CMD命令窗口
用Qt写了一个小软件,在把程序release后,打包分装后,发现程序运行的时候会伴随cmd命令窗口,可把我愁怀了 不过功夫不负有心人,在老师和我网友的帮助下,终于搞完了
560 0
Qt 独立运行时伴随CMD命令窗口
|
数据安全/隐私保护
Mac 技术篇-应用程序被锁定无法进行卸载问题解决方法,文件、文件夹被锁定无法移入废纸篓处理方法,卡巴斯基被锁定如何进行卸载演示
Mac 技术篇-应用程序被锁定无法进行卸载问题解决方法,文件、文件夹被锁定无法移入废纸篓处理方法,卡巴斯基被锁定如何进行卸载演示
1885 0
Mac 技术篇-应用程序被锁定无法进行卸载问题解决方法,文件、文件夹被锁定无法移入废纸篓处理方法,卡巴斯基被锁定如何进行卸载演示