Qt提供了QFileSystemWatcher类来监视文件和目录的改变。
addPath/addPaths:
设置需要监视的文件和目录
removePath/removePaths:
移除不需要监视的目录.
Signals:
当监视的文件被修改或删除时,产生一个fileChanged()信号。
如果被监视的目录被改变或删除,产生 directoryChanged()信号。
Q_SIGNALS:
void fileChanged(const QString &path);
void directoryChanged(const QString &path);
Timer:
void QPollingFileSystemWatcherEngine::run()
{
QTimer timer;
connect(&timer, SIGNAL(timeout()), SLOT(timeout()));
timer.start(PollingInterval);
(void) exec();
}
文件比较,基本上就看文件属性有没有改变:
class FileInfo
{
uint ownerId;
uint groupId;
QFile::Permissions permissions;
QDateTime lastModified;
QStringList entries;
public:
FileInfo(const QFileInfo &fileInfo)
: ownerId(fileInfo.ownerId()),
groupId(fileInfo.groupId()),
permissions(fileInfo.permissions()),
lastModified(fileInfo.lastModified())
{
if (fileInfo.isDir()) {
entries = fileInfo.absoluteDir().entryList(QDir::AllEntries);
}
}
FileInfo &operator=(const QFileInfo &fileInfo)
{
*this = FileInfo(fileInfo);
return *this;
}
bool operator!=(const QFileInfo &fileInfo) const
{
if (fileInfo.isDir() && entries != fileInfo.absoluteDir().entryList(QDir::AllEntries))
return true;
return (ownerId != fileInfo.ownerId()
|| groupId != fileInfo.groupId()
|| permissions != fileInfo.permissions()
|| lastModified != fileInfo.lastModified());
}
};
参考:
https://www.yuque.com/docs/share/bf57ebbf-0cba-419b-ad88-2b19aa0724d6