在Qt中可以使用QFileSystemWatcher类监视文件和目录的改变。在使用addPath()函数监视指定的文件和目录时,如果需要监视多个目录,则可以使用addPaths()函数加入监视。若要移除不需要监视的目录,则可以使用removePath()removePaths()函数。
当监视的文件被修改或删除时,产生一个fileChanged()信号。如果所监视的目录被改变或删除,则产生directoryChanged()信号。

头文件

  1. #ifndef WATCHER_H
  2. #define WATCHER_H
  3. #include <QFileSystemWatcher>
  4. #include <QLabel>
  5. #include <QWidget>
  6. class Watcher : public QWidget {
  7. Q_OBJECT
  8. public:
  9. Watcher(QWidget* parent = 0);
  10. ~Watcher();
  11. private:
  12. QLabel* pathLabel;
  13. QFileSystemWatcher fsWatcher;
  14. };
  15. #endif // WATCHER_H

实现

  1. #include "watcher.h"
  2. #include <QApplication>
  3. #include <QDir>
  4. #include <QMessageBox>
  5. #include <QVBoxLayout>
  6. Watcher::Watcher(QWidget* parent)
  7. : QWidget(parent)
  8. {
  9. QStringList args = qApp->arguments();
  10. QString path;
  11. // 读取命令行指定的目录作为监视目录。如果没有指定,则监视当前目录。
  12. if (args.count() > 1) {
  13. path = args[1];
  14. } else {
  15. path = QDir::currentPath();
  16. }
  17. pathLabel = new QLabel;
  18. pathLabel->setText(tr("监视的目录:") + path);
  19. QVBoxLayout* mainLayout = new QVBoxLayout(this);
  20. mainLayout->addWidget(pathLabel);
  21. fsWatcher.addPath(path);
  22. // 响应函数directoryChanged()使用消息对话框提示用户目录发生了改变
  23. connect(&fsWatcher, &QFileSystemWatcher::directoryChanged, this, [](QString path) {
  24. QMessageBox::information(NULL, tr("目录发生变化"), path);
  25. });
  26. }
  27. Watcher::~Watcher()
  28. {
  29. }

文件比较,基本上就看文件属性有没有改变:

  1. class FileInfo {
  2. uint ownerId;
  3. uint groupId;
  4. QFile::Permissions permissions;
  5. QDateTime lastModified;
  6. QStringList entries;
  7. public:
  8. FileInfo(const QFileInfo& fileInfo)
  9. : ownerId(fileInfo.ownerId())
  10. , groupId(fileInfo.groupId())
  11. , permissions(fileInfo.permissions())
  12. , lastModified(fileInfo.lastModified())
  13. {
  14. if (fileInfo.isDir()) {
  15. entries = fileInfo.absoluteDir().entryList(QDir::AllEntries);
  16. }
  17. }
  18. FileInfo& operator=(const QFileInfo& fileInfo)
  19. {
  20. *this = FileInfo(fileInfo);
  21. return *this;
  22. }
  23. bool operator!=(const QFileInfo& fileInfo) const
  24. {
  25. if (fileInfo.isDir() && entries != fileInfo.absoluteDir().entryList(QDir::AllEntries))
  26. return true;
  27. return (ownerId != fileInfo.ownerId()
  28. || groupId != fileInfo.groupId()
  29. || permissions != fileInfo.permissions()
  30. || lastModified != fileInfo.lastModified());
  31. }
  32. };