简述

QFileSystemWatcher类用于提供监视文件和目录修改的接口。

QFileSystemWatcher通过监控指定路径的列表,监视文件系统中文件和目录的变更。

调用addPath()函数可以监控一个特定的文件或目录。如果需要监控多个路径,可以使用addPaths()。通过使用removePath()和removePaths()函数来移除现有路径。

QFileSystemWatcher检查添加到它的每个路径,已添加到QFileSystemWatcher的文件可以使用的files()函数进行访问,目录则使用directories()函数进行访问。

当一个文件被修改、重命名或从磁盘上删除时,会发出fileChanged()信号。同样,当一个目录或它的内容被修改或​​删除时,会发射directoryChanged()信号。需要注意:文件一旦被重命名或从硬盘删除,目录一旦从磁盘上删除,QFileSystemWatcher将停止监控。

注:监控文件和目录进行修改的行为会消耗系统资源。这意味着,你的进程同时监控会有文件数量的限制。一些系统限制打开的文件描述符的数量默认为256。也就是说,如果你的进程试使用addPath()和addPaths()函数添加超过256个文件或目录到文件系统将会失败。

公共函数

bool addPath(const QString & path)
    如果路径存在,则添加至文件系统监控,如果路径不存在或者已经被监控了,那么不添加。

如果路径是一个目录,内容被修改或​​删除时,会发射directoryChanged()信号;否则,当文件被修改、重命名或从磁盘上删除时,会发出fileChanged()信号。

如果监控成功,返回true;否则,返回false.

监控失败的原因通常依赖于系统,但也包括资源不存在、接入失败、或总的监控数量限制等原因。

QStringList addPaths(const QStringList & paths)
    添加每一个路径至添加至文件系统监控,如果路径不存在或者已经被监控了,那么不添加。

返回值是不能被监控的路径列表。

QStringList directories() const
    返回一个被监控的目录路径列表。

QStringList files() const
    返回一个被监控的文件路径列表。

bool removePath(const QString & path)
    从文件系统监控中删除指定的路径。如果监控被成功移除,返回true。

删除失败的原因通常是与系统相关,但可能是由于路径已经被删除。

QStringList removePaths(const QStringList & paths)
    从文件系统监控中删除指定的路径。返回值是一个无法删除成功的路径列表。

信号

void directoryChanged(const QString & path)
    当目录被修改(例如:在指定的路径中添加或删除一个文件)或从磁盘删除时,这个信号被发射。注意:如果有在短时间内有几种变化,可能有些变化不会发出这个信号。然而,变化的序列中的最后的变化总会发射这个信号。

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

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

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

示例
下面,我们来实现一个文件/目录监控的类。

FileSystemWatcher.h

#ifndef FILE_SYSTEM_WATCHER_H 

#define FILE_SYSTEM_WATCHER_H #include <QObject> #include <QMap> #include <QFileSystemWatcher> class FileSystemWatcher : public QObject {   Q_OBJECT public:   static void addWatchPath(QString path); public slots:   void directoryUpdated(const QString &path); // 目录更新时调用,path是监控的路径   void fileUpdated(const QString &path); // 文件被修改时调用,path是监控的路径 private:   explicit FileSystemWatcher(QObject *parent = 0); private:   static FileSystemWatcher *m_pInstance; // 单例   QFileSystemWatcher *m_pSystemWatcher; // QFileSystemWatcher变量   QMap<QString, QStringList> m_currentContentsMap; // 当前每个监控的内容目录列表 }; #endif // FILE_SYSTEM_WATCHER_H

FileSystemWatcher.cpp

#include <QDir>
#include <QFileInfo>
#include <qDebug>
#include "FileSystemWatcher.h"
FileSystemWatcher* FileSystemWatcher::m_pInstance = NULL;
FileSystemWatcher::FileSystemWatcher(QObject *parent) : QObject(parent)
{
}// 监控文件或目录
void FileSystemWatcher::addWatchPath(QString path)
{qDebug() << QString("Add to watch: %1").arg(path);if (m_pInstance == NULL){m_pInstance = new FileSystemWatcher();m_pInstance->m_pSystemWatcher = new QFileSystemWatcher();// 连接QFileSystemWatcher的directoryChanged和fileChanged信号到相应的槽connect(m_pInstance->m_pSystemWatcher, SIGNAL(directoryChanged(QString)), m_pInstance, SLOT(directoryUpdated(QString)));connect(m_pInstance->m_pSystemWatcher, SIGNAL(fileChanged(QString)), m_pInstance, SLOT(fileUpdated(QString)));}// 添加监控路径m_pInstance->m_pSystemWatcher->addPath(path);// 如果添加路径是一个目录,保存当前内容列表
    QFileInfo file(path);if (file.isDir()){const QDir dirw(path);m_pInstance->m_currentContentsMap[path] = dirw.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files, QDir::DirsFirst);}
}// 只要任何监控的目录更新(添加、删除、重命名),就会调用。
void FileSystemWatcher::directoryUpdated(const QString &path)
{qDebug() << QString("Directory updated: %1").arg(path);// 比较最新的内容和保存的内容找出区别(变化)QStringList currEntryList = m_currentContentsMap[path];const QDir dir(path);QStringList newEntryList = dir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files, QDir::DirsFirst);QSet<QString> newDirSet = QSet<QString>::fromList(newEntryList);QSet<QString> currentDirSet = QSet<QString>::fromList(currEntryList);// 添加了文件QSet<QString> newFiles = newDirSet - currentDirSet;QStringList newFile = newFiles.toList();// 文件已被移除QSet<QString> deletedFiles = currentDirSet - newDirSet;QStringList deleteFile = deletedFiles.toList();// 更新当前设置 m_currentContentsMap[path] = newEntryList;if (!newFile.isEmpty() && !deleteFile.isEmpty()){// 文件/目录重命名if ((newFile.count() == 1) && (deleteFile.count() == 1)){qDebug() << QString("File Renamed from %1 to %2").arg(deleteFile.first()).arg(newFile.first());}}else{// 添加新文件/目录至Dirif (!newFile.isEmpty()){qDebug() << "New Files/Dirs added: " << newFile;foreach (QString file, newFile){// 处理操作每个新文件....
            }}// 从Dir中删除文件/目录if (!deleteFile.isEmpty()){qDebug() << "Files/Dirs deleted: " << deleteFile;foreach(QString file, deleteFile){// 处理操作每个被删除的文件....
            }}}
}// 文件修改时调用
void FileSystemWatcher::fileUpdated(const QString &path)
{QFileInfo file(path);QString strPath = file.absolutePath();QString strName = file.fileName();qDebug() << QString("The file %1 at path %2 is updated").arg(strName).arg(strPath);
}

注释很详细,我就不过多讲解了,下面我们就可以使用了。

#include "FileSystemWatcher.h" 

int main(int argc, char *argv[]) {   QApplication a(argc, argv);   FileSystemWatcher::addWatchPath("E:/Test");   ...   return a.exec();}

可以通过FileSystemWatcher::addWatchPath()来监控指定的文件/目录,监控之后,就可以在对应的路径进行更新测试了。

---------------------
作者:一去丶二三里
来源:CSDN
原文:Qt 之 QFileSystemWatcher
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/rainbow70626/p/10317463.html

[转]Qt 之 QFileSystemWatcher相关推荐

  1. Qt之QFileSystemWatcher

    简述 QFileSystemWatcher类用于提供监视文件和目录修改的接口. QFileSystemWatcher通过监控指定路径的列表,监视文件系统中文件和目录的变更. 调用addPath()函数 ...

  2. 【Qt】监视文件和目录的修改:QFileSystemWatcher

    一.说明 QFileSystemWatcher用于监视指定文件或目录列表的更改. 注意:监视文件或目录时需要打开相应的文件描述符,因此被监视的文件或目录数据是有限的,受系统允许的文件描述符数据等限制. ...

  3. Qt工作笔记-使用QFileSystemWatcher监控文件是否改变

    程序运行截图如下: 代码如下: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> class QFileSystem ...

  4. Qt学习笔记之文件处理

    Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...

  5. Qt总结之五:读写文件操作

    一.简介 通过QFile.QDir.QFileInfo和QFileSystemWatcher类简单介绍对文件和目录的一些操作.对文本流和数据流没有太多的介绍,还有一些Qt资源.统一资源定位符.缓冲区可 ...

  6. pythongui可视化编程_Python Qt GUI与数据可视化编程

    商品参数 Python Qt GUI与数据可视化编程 定价 99.00 出版社 人民邮电出版社 版次 dy 版 出版时间 2019年09月 开本 16 作者 王维波 等 装帧 平装 页数 488 字数 ...

  7. python qt5 gui快速编程_现货正版 Python Qt GUI与数据可视化编程 pyqt5教程书籍 pyqt5快速开发与实战Qt5 GUI快速编程 计算机网络程序设计人民邮电出版社...

    热销单品 查看更多 > RMB:85.00 立即购买 RMB:63.50 立即购买 RMB:73.50 立即购买 RMB:49.50 立即购买 RMB:127.80 立即购买 RMB:66.00 ...

  8. C++Qt开发——文件操作

    简介 QT中的IO操作通过统一的接口简化了文件与外部设备的操作方式,QT中文件被当作一种特殊的外部设备,文件操作与外部设备操作相同.IO操作的本质是连续存储空间的数据读写. 1. IO设备的类型 顺序 ...

  9. QT摄像头抓图浏览demo

    目录 整体说明 代码逻辑 整体说明 基本功能:打开摄像头.关闭摄像头.开始抓图.停止抓图.图片浏览 其他功能:抓图间隔时间可以设置,图片浏览可以设置手动翻页和自动播放 说明:抓图后进行图片分析(人脸识 ...

最新文章

  1. Android客户端开发—数据库SQLite基本语句
  2. Spring之作用域
  3. 口语学习Day8:今天聊聊微信有关的英语总结!
  4. Linux C学习--getline()函数
  5. requestAnimationFrame 简介
  6. 松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸
  7. 获取设置套接字选项:getsockopt, setsockopt
  8. Javascript基础语法总结
  9. 【架构师考试】架构师考试内容与历年真题
  10. 将VOC格式标注文件转换为Yolo格式
  11. MYSQL命令集大全
  12. linux php7.4,PHP 7.4登陆Ubuntu 20.04 LTS
  13. 海思 YOLOv5 pytorch 转 onnx 转 Caffe 再转 wk 的转化详解
  14. MT2503芯片处理器平台简介
  15. Cegui动画完美实现 .
  16. 客快物流大数据项目(七十):Impala入门介绍
  17. DSP SMBus总线通信
  18. CodeCombat代码全记录(Python学习利器)--SARVEN沙漠(第三章)代码6
  19. python中idx是什么意思_使用Python解析MNIST数据集(IDX文件格式)
  20. 2017云栖大会开源峰会预告

热门文章

  1. php操作剪贴板内容代码,JavaScript操作剪贴板的实现方法介绍
  2. wpf展开树节点_回归树分析与sklearn决策树案例,来玩一会
  3. 提款机转账多久到账?
  4. 热水器是长期开着好还是要等到用的时候才开?
  5. 1981年长城一元硬币值钱吗?
  6. 财务人员工资那么低,财务工作真的有价值吗?
  7. 自媒体玩到最后玩的是一种意识
  8. 为什么你拼命学,却一无所成?
  9. 【计算机网络】关于IP数据报 首部检验和的反码问题(二进制反码)
  10. t–sql pl–sql_糟糕SQL查询设计– SQL查询性能的杀手–基本知识