【QT】如何检测目录或文件中的内容被修改,可以使用QFileSystemWatcher类进行检测

news2025/1/8 4:49:42

目录

  • 1. QFileSystemWatcher类的介绍
  • 2. QFileSystemWatcher的公共函数
    • 2.1 构造函数
    • 2.2 析构函数
    • 2.3 添加监控的路径
    • 2.4 返回正在监控的目录或文件
    • 2.5 从文件系统监视程序中删除指定的路径
  • 3. QFileSystemWatcher的信号
  • 4. 测试代码
    • 4.1 操作步骤
    • 4.2 MainWindow.h
    • 4.3 MainWindow.cpp

1. QFileSystemWatcher类的介绍

QFileSystemWatcher类提供了一个接口,用于监视文件和目录以进行修改。
QFileSystemWatcher通过观察指定路径的列表来监视文件系统中文件和目录的更改。

调用addPath()来监视特定的文件或目录。可以使用addPaths()函数添加多个路径。现有的路径可以通过使用removePath()和removePaths()函数删除。
QFileSystemWatcher检查添加到它的每个路径。可以使用Files()函数访问已添加到QFileSystemWatcher中的文件,使用directories()函数访问目录。

fileChanged()信号在文件被修改、重命名或从磁盘删除时发出。类似地,当目录或其内容被修改或删除时,会发出directoryChanged()信号。

注意,一旦文件被重命名或从磁盘中删除,QFileSystemWatcher就会停止监视文件,一旦目录从磁盘中删除,QFileSystemWatcher就会停止监视目录。

2. QFileSystemWatcher的公共函数

2.1 构造函数

QFileSystemWatcher::QFileSystemWatcher(QObject *parent = Q_NULLPTR)

QFileSystemWatcher::QFileSystemWatcher(const QStringList &paths, QObject *parent = Q_NULLPTR)

2.2 析构函数

QFileSystemWatcher::~QFileSystemWatcher()

2.3 添加监控的路径

bool QFileSystemWatcher::addPath(const QString &path)

QStringList QFileSystemWatcher::addPaths(const QStringList &paths)

2.4 返回正在监控的目录或文件

QStringList QFileSystemWatcher::directories() const

QStringList QFileSystemWatcher::files() const

2.5 从文件系统监视程序中删除指定的路径

bool QFileSystemWatcher::removePath(const QString &path)

QStringList QFileSystemWatcher::removePaths(const QStringList &paths)

3. QFileSystemWatcher的信号

//当指定路径上的目录被修改(例如,当一个文件被添加或删除时)或从磁盘中移除时,发出这个信号。
void QFileSystemWatcher::directoryChanged(const QString &path)

//当指定路径上的文件被修改、重命名或从磁盘中删除时,发出此信号。
void QFileSystemWatcher::fileChanged(const QString &path)

请注意,如果在短时间内有几个变化,其中一些变化可能不会发出此信号,所以有这种文件短时间变化的情况,在addPath之前,最好添加个延迟。然而,变化序列中的最后一个变化总是会产生这个信号。

注意,这是一个私人信号。它可以用于信号连接,但不能由用户发出

4. 测试代码

4.1 操作步骤

  1. 运行以下代码,构造函数会在桌面自动创建一个test.cpp的文本文件
  2. 点击打开文件,此时会将test.txt文件中的内容写入到MainWinow界面
  3. 在桌面打开test.txt文件,并对文件进行修改并保存
  4. 此时,QFileSystemWatcher会检测到test.txt文件已被修改,会弹出提示信息
    在这里插入图片描述

4.2 MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QFileSystemWatcher>
#include <QGridLayout>
#include <QMainWindow>
#include <QMessageBox>
#include <QPlainTextEdit>
#include <QPushButton>
#include <QStandardPaths>
#include <QTextStream>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget* parent = 0);
    ~MainWindow();

private slots:
    void slotOpenFile();
    void slotFileChanged();

private:
    void createFile();

private:
    Ui::MainWindow* ui;

    QPushButton* m_pBtnOpenFile;
    //    QPushButton* m_pBtnRefreshFile;
    QPlainTextEdit* m_pTextShowContent;
    QString m_filePath;
    QFileSystemWatcher* m_pFileWatcher;
};

#endif  // MAINWINDOW_H

4.3 MainWindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
    resize(600, 400);
    QWidget* widget = centralWidget();

    //界面布局
    m_pBtnOpenFile = new QPushButton(tr("打开文件"), this);
    //    m_pBtnRefreshFile = new QPushButton(tr("刷新文件内容"), this);
    m_pTextShowContent = new QPlainTextEdit(this);
    QGridLayout* grid = new QGridLayout(widget);
    grid->addWidget(m_pBtnOpenFile, 0, 2, 1, 1);
    grid->addWidget(m_pTextShowContent, 1, 0, 6, 5);
    setLayout(grid);

    //创建txt文件
    createFile();

    //文件检测
    m_pFileWatcher = new QFileSystemWatcher();
    m_pFileWatcher->addPath(m_filePath);

    connect(m_pBtnOpenFile, &QPushButton::clicked, this, &MainWindow::slotOpenFile);
    connect(m_pFileWatcher, &QFileSystemWatcher::fileChanged, this, &MainWindow::slotFileChanged);
}

MainWindow::~MainWindow() {
    delete ui;
    if (m_pFileWatcher) {
        delete m_pFileWatcher;
        m_pFileWatcher = nullptr;
    }
}

void MainWindow::slotOpenFile() {
    QFile file(m_filePath);
    if (!file.exists()) {
        qDebug() << "文件不存在!";
    }
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "文件打开失败!";
    }
    QTextStream in(&file);
    while (!in.atEnd()) {
        m_pTextShowContent->appendPlainText(in.readAll());
    }
}

void MainWindow::slotFileChanged() {
    if (m_pFileWatcher->files().isEmpty()) {
        qDebug() << "被检测的文件为空";
        return;
    }

    QMessageBox messageBox(this);
    messageBox.setWindowTitle("警告");
    messageBox.setIcon(QMessageBox::Warning);
    messageBox.setText("文件已被修改,是否重新加载?");
    messageBox.addButton("否", QMessageBox::RejectRole);
    messageBox.addButton("是", QMessageBox::AcceptRole);
    if (messageBox.exec() == QDialog::Accepted) {
        m_pTextShowContent->clear();
        slotOpenFile();  //重新加载文件
    }
}

void MainWindow::createFile() {
    QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    m_filePath = desktopPath + "/test.txt";
    QFile file(m_filePath);
    if (!file.exists()) {
        qDebug() << "文件不存在!";
    }
    if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
        qDebug() << "文件打开失败!";
    }
    QString str = "目前打开的是一个新文件,用于测试文件是否被修改!";
    QTextStream out(&file);
    out << str;  //将str写入文件
    file.close();
}

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

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

相关文章

Spring之Bean的配置与实例

Spring之Bean的配置与实例 一、Bean的基础配置1. Bean基础配置【重点】配置说明代码演示运行结果 2. Bean别名配置配置说明代码演示打印结果 3. Bean作用范围配置【重点】配置说明代码演示打印结果 二、Bean的实例化1. Bean是如何创建的2. 实例化Bean的三种方式2.1 构造方法方式…

数据库系统-数据库查询实现算法之

文章目录 一、一趟扫描算法1.1 算法概述1.2 算法逻辑&物理实现1.2.1 逻辑层面1.2.2 物理层面1.2.2.1 P11.2.2.2 P21.2.2.3 P31.2.2.4 P4 1.3 迭代器构造查询实现算法1.4 关系操作的一趟扫描算法1.4 基于索引的查询实现算法 二、两趟扫描算法2.1 两趟算法基本思想2.2 多路归…

SaaS是什么?企业为什么要有SaaS系统?

什么是SaaS系统&#xff1f;企业为什么要有SaaS系统&#xff1f; 近几年&#xff0c;SaaS突然变成了一个热门词汇&#xff0c;无论是一些权威报告&#xff0c;还是知乎上知友们热烈的讨论&#xff0c;对于Saas系统可谓是各有各的见解和看法。 今天就综合几位答主的观点&#…

【1163. 按字典序排在最后的子串】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xff1a; 输入&#xff1a;s "abab" 输出&#xff1a;"bab"…

安波福又有大动作,行泊一体中国方案即将量产

“安波福的目标是&#xff0c;2030年营收达到400亿美元规模&#xff0c;这其中有一大部分收入来自于软件。”安波福亚太区总裁杨晓明在接受高工智能汽车提问时表示。 他介绍&#xff0c;2030年软件业务目标是达到60亿美元的规模&#xff0c;而在2022年&#xff0c;安波福实现了…

Nacos身份绕过漏洞复现(QVD-2023-6271)

Nacos身份绕过漏洞复现&#xff08;QVD-2023-6271&#xff09; 公司上级预警QVD-2023-6271&#xff0c;领导安排进行排查。 本着知己知彼的原则&#xff0c;我在本地将该漏洞复现出来。 漏洞原理&#xff1a;Nacos 在默认配置下未对 token.secret.key 进行修改&#xff0c;导…

【好题】好题分享

1001-四舍五入_牛客竞赛语法入门班数组模拟、枚举、贪心习题 (nowcoder.com) 题目描述 四舍五入是个好东西。比如你只考了45分&#xff0c;四舍五入后你是50分再四舍五入你就是满分啦&#xff01;qdgg刚考完拓扑。成绩十分不理想。但老师觉得他每天都很认真的听课很不容易。于是…

ubuntu 22 安装

下载镜像 下载 https://ubuntu.com/download/server 我这里下载了 22 服务器版 使用工具制作U盘镜像 安装完毕后 插入安装的电脑U盘插口 DEL 进入 选择U盘启动 进入后 我这里选择了第一个&#xff0c;没有选择mini版本 之后进入后按推荐一直安装 在选择静态地址的时候 subn…

你还在用Object.equals()方法吗?

当《阿里巴巴Java开发手册》发布后&#xff0c;我也是仔细进行了阅读&#xff0c;想从中找出一些“标准”&#xff0c;让自己的代码质量提高。手册中对 Object 的 equals 方法的使用进行了强制&#xff0c;而且推荐使用 JDK7 中工具类 Objects 的 equals 方法&#xff0c;至此之…

我在 Linux部署皕杰报表遇到的问题及解决方法

Linux是一种自由和开放源码的类 UNIX 操作系统&#xff0c;作为服务器的操作系统广泛应用。Linux由林纳斯托瓦兹在赫尔辛基大学上学时创立&#xff0c;主要受到 Minix 和 Unix 思想的启发。Linux英文解释为 Linux is not Unix。 皕杰报表支持在linux系统中部署&#xff0c;只需…

短视频矩阵优化系统开发步骤:

1. 矩阵号注册&#xff1a;用户可以通过该功能注册矩阵号&#xff0c;填写个人基本信息并上传身份证明材料进行实名认证。 2. 矩阵号登录&#xff1a;用户使用注册成功的账号密码登录矩阵号系统。 3. 矩阵号管理&#xff1a;用户可以通过该功能管理自己的矩阵号&#xff0c;包…

3 亿岗位将被 AI 取代?巴比特深度采访业界后,“失业潮”真相有些出人意料……...

图片来源&#xff1a;由无界 AI工具生成 人工智能技术的发展正迎来奇点&#xff0c;尤其是今年以来 ChatGPT 和 AIGC 的迅猛势头让无数人猝不及防&#xff0c;真真切切地对各行各业现有的工作岗位产生冲击。近日&#xff0c;蓝色光标全面停止创意设计、方案撰写、文案撰写、短期…

Oracle:ORA-00600[4137]问题分析

背景: 在为用户的新机房环境Oracle 19.18版本数据库检查时&#xff0c;发现smon进程后台日志不断出现事务恢复报错Serial Transaction recovery caught exception 30319&#xff0c;进一步检查发现存在事务恢复失败报ORA-00600[4137] 问题: smon进程后台日志不断出现事务恢复报…

【对比】文心一言对飚ChatGPT实操对比体验

前言 &#x1f34a;缘由 百度【文心一言】体验申请通过 本狗中午干饭时&#xff0c;天降短信&#xff0c;告知可以体验文心一言&#xff0c;苦等一个月的实操终于到来。心中这好奇的对比心理油然而生&#xff0c;到底是老美的【ChatGPT】厉害&#xff0c;还是咱度娘的【文心一…

地下污水厂智能照明控制应用

摘要:结合某地下污水厂项目&#xff0c;从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统&#xff0c;探索了一套适用于地下污水厂的智能照明控制策略&#xff0c;以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…

苦熬10年,国产操作系统“归零”,新操作系统上新,跟Excel很像

苦熬10余年&#xff0c;国产操作系统自主研发 说到国内自主研发的操作系统&#xff0c;经验最丰富的品牌&#xff0c;当然是麒麟OS. 从诞生到发展&#xff0c;历经10多年的努力&#xff0c;麒麟os逐渐成为了国内自主研发操作系统领域中的一颗耀眼的明珠。麒麟OS不仅推出了许多…

Java基础(十)字符串相关类

1 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如"hello" &#xff09;都可以看作是实现此类的实例。 字符串是常量&#xff0c;用双引号引起来表示。它们的值在创…

​如何恢复回收站清空的文件?

清空回收站后可以恢复删除的文件吗&#xff1f; 你是否遇到过清空回收站后才意识到某些文件不应删除的情况。发生这种情况时&#xff0c;许多人会感到恐慌&#xff0c;并且想知道是否有可能恢复回收站清空的文件。 事实上&#xff0c;你不必为此担心。当用户清空回收站时&a…

一种大于2GB ONNX模型onnxsim优化方法

大于2GB模型onnxsim优化很耗时&#xff0c;容易挂掉&#xff0c;而且需要特别大的系统内存。 这里提出一种比较简单的优化大于2GB ONNX模型的方法&#xff1a; 基本思路是 把卷积和矩阵乘的权重&#xff08;参数量大于某个阈值&#xff09;替换为ConstantOfShape&#xff0c…

GB/T 28181-2022 新版差异笔记

GB/T 28181-2022 新版差异笔记 文章目录 GB/T 28181-2022 新版差异笔记更改了标准范围删除部分术语和定义增加PTZ缩略语更改SIP监控域互联结构图更改了“联网系统通讯协议结构图”增加了媒体流数据传输的RTP时间戳要求增加了对H.265、AAC的支持更改了SDP协议的引用更改了与其他…