我想在Linux上使用inotify
机制。 我希望我的应用程序知道文件aaa
何时更改。 你可以给我一个样本如何做到这一点?
inotify C API
Inotify提供三种系统调用来构建各种文件系统监视器:
read()和close()系统调用也是需要的。 给定由inotify_init()产生的描述符,调用read()来等待警报。 假设一个典型的文件描述符,应用程序阻塞等待接收事件,这些事件被表示为流中的数据。 从inotify_init()得到的文件描述符上的公共close()删除并释放所有活动监视以及与inotify实例关联的所有内存。 (典型的引用计数警告也适用于这里,所有与实例相关的文件描述符必须在手表被内存消耗之前关闭,并且被释放。)
#include "inotify.h" #include "inotify-syscalls.h" int wd; wd = inotify_add_watch (fd, "/home/rlove/Desktop", IN_MODIFY | IN_CREATE | IN_DELETE); if (wd < 0) perror ("inotify_add_watch");
本示例在目录/ home / rlove / Desktop上添加一个监视器,以进行任何修改,文件创建或文件删除。
以下是如何使用inotify观看“aaa”的片段。 请注意,我没有测试过这个,我甚至没有编译它! 你将需要添加错误检查。
您也可以使用inotfd上的poll / select来代替使用阻塞式读取。
const char *filename = "aaa"; int inotfd = inotify_init(); int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY); size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1; struct inotify_event* event = malloc(bufsiz); /* wait for an event to occur */ read(inotfd, event, bufsiz); /* process event struct here */
由于最初的问题似乎提到Qt作为标签在这里的几个评论中指出,搜索引擎可能已经带领你在这里。
如果有人想知道如何使用Qt,请参阅http://doc.qt.io/qt-5/qfilesystemwatcher.html Qt版本。 在Linux上,它使用Inotify的一个子集,如果可用的话,请参阅Qt页面上的解释。
基本上所需的代码如下所示:
在mainwindow.h中添加:
QFileSystemWatcher * watcher; private slots: void directoryChanged(const QString & path); void fileChanged(const QString & path);
和mainwindow.cpp:
#include <QFileInfo> #include <QFileSystemWatcher> watcher = new QFileSystemWatcher(this); connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &))); connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &))); watcher->addPath("/tmp/"); // watch directory watcher->addPath("/tmp/a.file"); // watch file
还要添加mainwindow.cpp中如果发现文件/目录更改被调用的插槽:
void MainWindow::directoryChanged(const QString & path) { qDebug() << path; } void MainWindow::fileChanged(const QString & path) { qDebug() << path; }