我正在尝试使用POCO文件系统库中的DirectoryWatcher类来监视特定文件夹的更改。代码很简单,看起来像这样:
Monitor::Monitor() {
pattern = new Glob("/path/to/dir/*.dat",
Glob::GLOB_DOT_SPECIAL);
watcher = new DirectoryWatcher(std::string("/path/to/dir"));
watcher->itemAdded += delegate(this, &Monitor::onFileAdded);
watcher->itemModified += delegate(this, &Monitor::onFileChanged);
}
void Monitor::onFileAdded(const DirectoryWatcher::DirectoryEvent& addEvent) {
if (pattern->match(addEvent.item.path())) {
std::cout << "File added: " << addEvent.item.path() << std::endl;
}
}
void Monitor::onFileChanged(const DirectoryWatcher::DirectoryEvent& changeEvent) {
if (pattern->match(changeEvent.item.path())) {
std::cout << "File changed: " << changeEvent.item.path() << std::endl;
}
}
我正在观察一些奇怪的行为。如果我将文件的新版本复制到已经在监视文件夹中的文件,我会收到两次“项目已更改”通知。如果我打开已经在监视文件夹中的文件,编辑其内容并保存,我会收到“已添加项目”通知,然后是“项目已更改”通知。
这是在Ubuntu Linux 14.04和带有POCO 1.4.6p2的ext4文件系统上。
还有其他人观察过类似行为吗?这可能与我的机器和OS /文件系统组合的某些特定特性有关吗?是否有可能以某种方式过滤不需要的事件?
提前致谢。