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
Qt 文件监视器 QFileSystemWatcher的更多相关文章
- QT文件和目录
一.文件操作 QFile和QFileInfo: #include <QCoreApplication> #include <QFileInfo> #include <QS ...
- Qt 文件处理(readLine可以读取char[],并且有qSetFieldWidth qSetPadChar 等全局函数)
Qt 文件处理 Qt提供了QFile类来进行文件处理,为了更方便地处理文本文件或二进制文件,Qt还提了QTextStream类和QDataStream类,处理临时文件可以使用QTemporaryFil ...
- Windows文件监视器 1.0 绿色版
软件名称:软件名称: Windows文件监视器 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Win2008 软件大小: 1 ...
- Qt文件发布
1.打开Qt文件夹下的,其他版本可能为Qt (版本号)for Desktop cmd 2.将Release文件下的exe文件复制到别的文件夹,我这里为G:\Qt\QT_project\ff 3.在Qt ...
- Qt文件读写操作
原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html QFile Class 1.read读文件 加载文件对象 QFile file(&qu ...
- QT 文件对话框(QFileDialog)
1.选择文件(上传.打开...) QString QFileDialog::getOpenFileName( QWidget *parent = , //parent,用于指定父组件.注意,很多Qt组 ...
- QT 文件操作
QT提供了QFile类用于文件读写 QFile可以读写文本文件,也可以读写二进制文件 #include "widget.h" #include <QGridLayout> ...
- Qt文件信息获取之QFileInfo
在Qt中为文件的操作和信息获取提供了许多方便的类,常用的有QDir,QFile,QFileInfo以及QFileDialog,在本文中主要介绍用于获取关于文件信息的QFileInfo类. QFileI ...
- Qt 文件搜索(写入文本文件)
代码无意间在网上找到,下载回来后改了几个格式,编译后经测试可以正常使用,这个个文件搜索的很好的例子,有两种搜索方式:一种是按文件名作为关键字进行搜索,一种是以文档中所包含的关键字进行搜索,贴两张图先: ...
随机推荐
- android学习----overridePendingTransition
1 Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画. 它包括两个部分:一部分是第一个activity退出时的动画:另外一部分时第二个activity进入时 ...
- HDU 3625 Examining the Rooms
题目大意:有n个房间,n!个钥匙,在房间中,最多可以破k扇门,然后得到其中的钥匙,去开其它的门,但是第一扇门不可以破开,求可以打开所有门的概率. 题解:首先,建立这样的一个模型,题目相当于给出一个图, ...
- POJ-1006 Biorhythms
[题目描述] 三个周期时间分别为:23,28和33.分别给定三个周期的某一天(不一定是第一天),和开始计算的日期,输出下一个triple peak. [思路分析] 如果不了解中国剩余定理,可以通过模拟 ...
- 前端性能监控系统ShowSlow
作者:zhanhailiang 日期:2014-11-14 1. 简单介绍 ShowSlow是开源的前端性能监控系统,提供了下面功能: 前端性能指标数据收集功能:ShowSlow原生提供了数据收集工具 ...
- IOS_OC_id ,NSObject, id<NSObject>差别
我们常常会混淆下面三种申明(我是没有留意过): 1. id foo1; 2. NSObject *foo2; 3. id<NSObject> foo3; 第 ...
- [LeetCode] Longest Substring Without Repeating Characters (LinkedHashSet的妙用)
Given a string, find the length of the longest substring without repeating characters. For example, ...
- HTTP消息头详解
HTTP是一个属于应用层面的面向对象的协议,由于其便捷.快速的方式.适用于分布式超媒体信息系统.于1990年提出 HTTP 协议主要特点概括如下 1.支持客户/服务器模式. 2.简单快速 请求方法常用 ...
- Axure使用
(一) Axure rp的界面 1-主菜单工具栏 大部分类似office软件,不做详细解释,鼠标移到按钮上都有对应的提示. 2-主操作界面 绘制产品原型的操作区域,所有的用到的元件都拖到该区域. 3 ...
- Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)
链接地址:http://www.cocoachina.com/bbs/read.php?tid=273479 Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖) ...
- JavaSE学习总结第08天_面向对象3
08.01 工具类中使用静态 例: class ArrayTool { //将构造方法私有,外界不能创建该类的对象 private ArrayTool(){} //遍历数组 public stat ...