简述

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
{
// 添加新文件/目录至Dir
if (!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()来监控指定的文件/目录,监控之后,就可以在对应的路径进行更新测试了。

Qt之QFileSystemWatcher的更多相关文章

  1. [转]Qt 之 QFileSystemWatcher

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

  2. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  3. Qt 文件监视器 QFileSystemWatcher

    之前有过对Qt的QFile以Text纯文本方式进行读取时的学习,这两天由于实时需要又对QFileSystemWatcher(这个类是干什么用的)进行了学习,发现也是问题很让人头疼. 我想监视一个文件夹 ...

  4. Qt 文件处理(readLine可以读取char[],并且有qSetFieldWidth qSetPadChar 等全局函数)

    Qt 文件处理 Qt提供了QFile类来进行文件处理,为了更方便地处理文本文件或二进制文件,Qt还提了QTextStream类和QDataStream类,处理临时文件可以使用QTemporaryFil ...

  5. Qt 学习之路:QFileSystemModel

    上一章我们详细了解了QStringListModel.本章我们将再来介绍另外一个内置模型:QFileSystemModel.看起来,QFileSystemModel比QStringListModel要 ...

  6. qt model/view 架构自定义模型之QFileSystemModel

    # -*- coding: utf-8 -*- # python:2.x #QFileSystemModel """ Qt  内置了两种模型:QStandardItemM ...

  7. 将vim作为QT开发的IDE

    转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIM ...

  8. 用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)

    Use Case: 两个程序共享同一个Configuration文件,当一个程序作出改变的时候,需要另外一个程序能够及时响应. 之前其实猜的八九不离十,估计是有一个Timer,然后定时查询Config ...

  9. 14.QT-QFile文件,QBuffer缓冲区,QDir目录,QFileSystemWatcher文件系统监视

    QFile Qt中所有与IO相关的类都继承于QIODevice,继承图如下所示: 其中QFile类便是用于文件操作的类 在QT中,将文件当做一种特殊的外部设备对待(比如:串口,usb等就是外部设备) ...

随机推荐

  1. VBA读取文件夹下所有文件夹及文件内容,并以树形结构展示

    Const TR_LEVEL_MARK = "+"Const TR_COL_INDEX = "A"Const TR_COL_LEVEL = "E&qu ...

  2. android webview web里面的数据透传到java以及java的数据透传到web

    详见: http://tutorials.jenkov.com/android/android-web-apps-using-android-webview.html#android-web-app- ...

  3. JSON.NET 教程(一)

    下载地址:http://www.newtonsoft.com/json 参考官网文档:http://www.newtonsoft.com/json/help/html/SerializingJSON. ...

  4. nginx查看配置文件nginx.conf路径

      当你执行 nginx -t 得时候,nginx会去测试你得配置文件得语法,并告诉你配置文件是否写得正确,同时也告诉了你配置文件得路径:  # nginx -t nginx: the configu ...

  5. JAVA异常体系

    1.异常体系 ----|Throwable 所有错误或异常的父类 --------|Error(错误) --------|Exception(异常)一般能通过代码处理 ------------|运行时 ...

  6. Servlet初识

    1.servlet的生命周期 servlet生命周期中的三大重要时刻 servlet从不存在状态迁移到初始化状态(能够为客户提供服务),首先是从构造函数开始,但是构造函数只是使其成为一个对象,而不是一 ...

  7. VS2010中添加lib库引用

    VS2010中添加lib库引用: 1 菜单  项目---> 属性--->配置属性-->链接器---->输入---附加依赖项,  加入库名,如: my_API.lib; 或是在c ...

  8. RPI学习--wiringPi_setups

    reference: http://wiringpi.com/reference/setup/ There are four ways to initialise wiringPi. wiringPi ...

  9. javascript插件uploadify简单实现文件上传

    最近在学习mvc,需要用到文件上传的功能,找了很多的jquery插件,最后决定使用uploadify这个插件,参照了各位大神的博客,终于勉勉强强会用了.在此,做一下笔记,方便以后忘了查看. 首先在官网 ...

  10. selectors实现高并发

    1. 下面的例子,客户端给服务端发送消息,服务端把消息返回 server #!/usr/bin/env python import selectors import socket import tim ...