Qt 文件监视器 QFileSystemWatcher

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

我想监视一个文件夹(比如:"F:\QtWorkSpace")里面某些特定文件(如当天以时间戳命名的日志文件)的监视,这个文件夹里面的文件不会被删除,只会有新的文件添加,而这些文件也只会被增加内容,那么假设我在我的QObject对象实例中定义的监视器QFileSystemWatcher命名为m_watcher,我在构造函数中的connect语句如下:

?


1

2

3

4

connect(m_watcher,SIGNAL(directoryChanged(const QString)),

this,SLOT(on_DirectoryChanged(QString)));

connect(m_watcher,SIGNAL(fileChanged(QString)),this,

SLOT(on_FileChanged(const QString)));

(on_DirectoryChanged和on_FileChangeed都是自定义的slot)首先,比如说我早上八点起床,开启我的应用程序之后,我监视的文件就是以这个时刻的时间戳命名的日志文件(加入命名规则为<时间戳+".log":hh_mm.log>),那么这个文件名称就是"08_00.log",在构造函数里面直接m_watcher->addPath("08_00.log").过了一会有后台程序往里面写日志,那么在on_FileChanged函数里面我的处理是,直接把被监视的文件中所添加的内容显示在程序的界面上,这个没有问题.而我在on_DirectoryChanged函数里面是这样的:首先,获取当前的时间戳,然后通过之前文件命名规则的到一个QString newLog,我先对比这个newLog和我之前正在监视的日志文件名称,如果一样的话,我就什么也不做,如果不一样,我就把之前的监视的文件从监视器里面去除掉(通过m_watcher的removePath),然后把newLog添加到监视器里面去进行监视,之前的那个文件就不管了.

于是我就想当然的这么做了,但是最后的结果却出乎意料.

如果我在on_DirectoryChanged打上了断点进行调试,只要我按规矩添加新的日志文件,然后往这个文件里添加新的内容,保存之后,界面上就会如我所预期的那样把新添加的内容给显示出来.然后呢,我就把断电删除点,进行同样的文件添加和操作,却发现什么也没有显示出来,我往新文件里添加的东西并没有如我所愿的被显示出来.而查看"应用程序输出"的时候发现,里面会输出"添加hh_mm.log文件失败.".

后来查看QFileSystemWatcher的CPP文件源代码http://www.oschina.net/code/explore/qt-4.7.1/src/corelib/io/qfilesystemwatcher.cpp的时候才发现,这个类的实现有一个临界区,于是恍然大悟.因为signal和slot这个机制不是异步的,如果我都在on_DirectoryChanged的函数体里面进行removePath和addPath两个动作的时候,其中必然会有一个失败而另一个成功(不考虑文件路劲不存在的情况或者是路径已经被remove或者add的情况),所以这两个动作只能有一个在这个函数里面执行.

所以我最后的解决办法是,只在on_DirectoryChanged里面addPath,而在on_FileChanged里面removePath,也就是等待m_watcher对临界区解锁之后进行remove就行了.

http://www.oschina.net/question/658193_118503

时间: 2024-10-07 08:45:17

Qt 文件监视器 QFileSystemWatcher的相关文章

QT开发(二十四)——QT文件操作

QT开发(二十四)--QT文件操作 一.QT文件操作简介 QT中的IO操作通过统一的接口简化了文件与外部设备的操作方式,QT中文件被当作一种特殊的外部设备,文件操作与外部设备操作相同. 1.IO操作的主要函数接口 打开设备:bool open(OpenMode mode) 读取数据:QByteArray read(qint64 maxSize) 写入数据:qint64 write(const QByteArray & byteArray) 关闭设备:void close() IO操作的本质是连续

Qt文件信息获取之QFileInfo

在Qt中为文件的操作和信息获取提供了许多方便的类,常用的有QDir,QFile,QFileInfo以及QFileDialog,在本文中主要介绍用于获取关于文件信息的QFileInfo类. QFileInfo可以提供文件的名称和位置信息,此外,还有文件的大小,文件的访问权限以及此文件是不是一个符号链接等信息.不仅如此,我们还可以通过这个类来查看文件的创建时间,修改时间和最近一次读取时间. 下面的程序用于获取文件的时间信息: 1 void MainWindow::on_browserBtn_clic

Windows文件监视器 1.0 绿色版

软件名称:软件名称: Windows文件监视器 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Win2008 软件大小: 176 KB 图片预览: 软件简介: 本程序可以对指定的某个盘符或某个目录进行监视,监视的内容包括任何文件及子文件夹的新建.删除.重命令.大小修改等等,并显示监视的结果 软件下载地址:电信下载 联通下载

Qt文件编程 换行处显示小方块问题【已解决】

使用Qt写一个hex合并程序,遇到了在window下换行显示小方块问题,如下图: 通过查看Qt自带的帮助文档关于openMode的介绍,找到解决办法: 在Qt的文件打开代码中都添加 | QIODevice::Text问题即可解决. 如下:

第一个QT文件为毛编译不出来

终于决定学下QT了,最近你好懒啊,话说QT现在用的人好像也开始多起来了呢... 刚刚写了一个HELLO WORLD QT版,可惜弄了半天总是找不到头文件<QApplication>, 然后发现是路径问题,改成这样就可以了: $ /usr/share/qt4/bin/qmake -project $ /usr/share/qt4/bin/qmake $ /usr/bin/qmake-qt4;make 总是要这样么?真是郁闷啊,你再找找配置方法好啦... 额,找到一个简单的解决办法: qmake-

QT 文件对话框(QFileDialog)

1.选择文件(上传.打开...) 1 QString QFileDialog::getOpenFileName( 2 QWidget *parent = 0, //parent,用于指定父组件.注意,很多Qt组件的构造函数都会有这么一个parent参数,并提供一个默认值0: 3 const QString &caption = QString(), //caption,是对话框的标题 4 const QString &dir = QString(), //dir,是对话框显示时默认打开的目

QT文件读写

1.创建一个文件流对象 QFile f("log.txt"); 2.规定打开方式 if(!f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { qDebug() << "Open failed." << endl; return ; } 3.创建一个文本流对象,用来操作刚才的文件对象 QTextStream txtOutput(&f); txtOut

Node.js 扩展时间监听器:文件监视器

创建一个Watcher类来处理放在某个目录下的文件.然后可以用这个类创建一个工具,该工具可以监视目录(watch目录,将放到里面的文件名都改成小写),并将文件复制到一个单独目录(done目录)中. 扩展事件发射器需要三步: 创建类的构造器: 继承时间发射器的行为: 扩展这些行为. 代码: function Watcher(watchDir, processedDir) { this.watchDir = watchDir; this.processedDir = processedDir; }

Qt——文件对话框

教程:https://www.devbean.net/2012/09/qt-study-road-2-file-dialog/ 代码如下: //mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> class QTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidg