<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C++ Qt開發:QFileSystemWatcher文件監視組件

      Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用QFileSystemWatcher組件實現對文件或目錄的監視功能。

      QFileSystemWatcher 是 Qt 框架中提供的一個類,用于監視文件系統中的文件和目錄的變化。它允許你在文件或目錄發生變化時接收通知,并可以用于監視文件的創建、刪除、重命名以及內容修改等操作。這對于需要實時監控文件系統變化的應用程序是非常有用的。

      下面是關于 QFileSystemWatcher 類的一些常用函數的解釋:

      函數 描述
      QFileSystemWatcher(QObject *parent = nullptr) 構造函數,創建一個文件系統監視器對象。
      void addPath(const QString &path) 添加要監視的文件或目錄路徑。
      void addPaths(const QStringList &paths) 添加要監視的多個文件或目錄路徑。
      bool removePath(const QString &path) 移除要監視的文件或目錄路徑。
      void removePaths(const QStringList &paths) 移除要監視的多個文件或目錄路徑。
      bool contains(const QString &path) const 檢查監視器是否包含指定的文件或目錄路徑。
      QStringList files() const 返回當前監視的文件路徑列表。
      QStringList directories() const 返回當前監視的目錄路徑列表。
      void setFilter(QFileSystemWatcher::Filter filter) 設置監視器的過濾器,用于指定要監視的事件類型。
      QFileSystemWatcher::Filter filter() const 返回監視器當前的過濾器設置。
      void fileChanged(const QString &path) 信號,當監視的文件發生變化時發出。
      void directoryChanged(const QString &path) 信號,當監視的目錄發生變化時發出。

      這些函數允許你動態地添加或移除要監視的文件或目錄,設置過濾器以確定要監視的事件類型,并連接相應的信號以處理文件系統的變化事件。

      首先我們需要新增一個filesystem.h頭文件,該類主要用于實現對文件訪問的封裝,其中addWatchPath用于增加一個被監控目錄,當目錄被更新世則調用directoryUpdated,文件被修改調用fileUpdated

      #ifndef FILESYSTEM_H
      #define FILESYSTEM_H
      #include <QObject>
      #include <QMap>
      #include <QString>
      #include <QMap>
      #include <QFileSystemWatcher>
      
      class FileSystemWatcher : public QObject
      {
          Q_OBJECT
      
      public:
          static void addWatchPath(QString path);
      
      public slots:
      
          // 目錄更新時調用
          void directoryUpdated(const QString &path);
      
          // 文件被修改時調用
          void fileUpdated(const QString &path);
      
      private:
          explicit FileSystemWatcher(QObject *parent = 0);
      
      private:
          // 單例
          static FileSystemWatcher *m_pInstance;
      
          // QFileSystemWatcher變量
          QFileSystemWatcher *m_pSystemWatcher;
      
          // 當前每個監控的內容目錄列表
          QMap<QString, QStringList> m_currentContentsMap;
      };
      
      #endif // FILESYSTEM_H
      

      接著是filesystem.cpp主函數部分,首先FileSystemWatcher::addWatchPath用于增加一個監控目錄。這里的重點在于創建兩個信號,當m_pSystemWatcher收到監控數據時,我們讓其分別去觸發directoryChangedfileChanged兩個信號,在信號中分別攜帶一個參數傳遞給directoryUpdatedfileUpdated槽函數上進行處理,如果是目錄則保存目錄中的內容。

      void FileSystemWatcher::addWatchPath(QString path)
      {
         qDebug() << QString("添加監控目錄: %1").arg(path);
      
          if (m_pInstance == NULL)
          {
              m_pInstance = new FileSystemWatcher();
              m_pInstance->m_pSystemWatcher = new QFileSystemWatcher();
      
              // 連接QFileSystemWatcher的directoryChanged和fileChanged信號到相應的槽
              connect(m_pInstance->m_pSystemWatcher, SIGNAL(directoryChanged(QString)), m_pInstance, SLOT(directoryUpdated(QString)));
              connect(m_pInstance->m_pSystemWatcher, SIGNAL(fileChanged(QString)), m_pInstance, SLOT(fileUpdated(QString)));
          }
      
          // 添加監控路徑
          m_pInstance->m_pSystemWatcher->addPath(path);
      
          // 如果添加路徑是一個目錄,保存當前內容列表
          QFileInfo file(path);
          if (file.isDir())
          {
              const QDir dirw(path);
              m_pInstance->m_currentContentsMap[path] = dirw.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
          }
      }
      

      接著是FileSystemWatcher::directoryUpdated函數的實現部分,如下所示代碼,通過QFileSystemWatcher來監聽指定目錄下文件和子目錄的變化。當目錄發生變化時,調用directoryUpdated槽函數,比較最新的目錄內容和之前保存的內容,找出新增文件、刪除文件以及文件重命名等變化。

      • 功能概述
        1. 添加監控路徑:通過addWatchPath函數添加監控路徑,創建QFileSystemWatcher對象并連接相關信號和槽。
        2. 目錄更新處理:當監控的目錄發生變化時,調用directoryUpdated槽函數。
        3. 內容變化比較:比較最新的目錄內容和之前保存的內容,找出新增文件、刪除文件和文件重命名等變化。
        4. 文件重命名處理:如果有文件重命名,輸出文件重命名的信息。
        5. 新增文件處理:輸出新建文件的信息,并可以在相應的邏輯中處理每個新文件。
        6. 刪除文件處理:輸出刪除文件的信息,并可以在相應的邏輯中處理每個被刪除的文件。

      代碼對文件系統的變化進行了細致的監控和處理,可以用于實時監控目錄下文件的變動情況,例如新增文件、刪除文件和文件重命名等操作。當用戶需要自定義功能時可以在信息輸出前對特定目錄做進一步處理以達到監視并控制特定文件的功能。

      // 任何監控的目錄更新(添加、刪除、重命名)則調用
      void FileSystemWatcher::directoryUpdated(const QString &path)
      {
          qDebug() << QString("目錄更新: %1").arg(path);
      
          // 比較最新的內容和保存的內容找出區別(變化)
          QStringList currEntryList = m_currentContentsMap[path];
          const QDir dir(path);
      
          QStringList newEntryList = dir.entryList(QDir::NoDotAndDotDot  | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
      
          QSet<QString> newDirSet = QSet<QString>::fromList(newEntryList);
          QSet<QString> currentDirSet = QSet<QString>::fromList(currEntryList);
      
          // 添加了文件
          QSet<QString> newFiles = newDirSet - currentDirSet;
          QStringList newFile = newFiles.toList();
      
          // 文件已被移除
          QSet<QString> deletedFiles = currentDirSet - newDirSet;
          QStringList deleteFile = deletedFiles.toList();
      
          // 更新當前設置
          m_currentContentsMap[path] = newEntryList;
      
          if (!newFile.isEmpty() && !deleteFile.isEmpty())
          {
              // 文件/目錄重命名
              if ((newFile.count() == 1) && (deleteFile.count() == 1))
              {
                 qDebug() << QString("文件重命名 %1 到 %2").arg(deleteFile.first()).arg(newFile.first());
              }
          }
          else
          {
              // 添加新文件/目錄至Dir
              if (!newFile.isEmpty())
              {
                 qDebug() << "新建文件或目錄: " << newFile;
      
                  foreach (QString file, newFile)
                  {
                      // 處理操作每個新文件....
                  }
              }
      
              // 從Dir中刪除文件/目錄
              if (!deleteFile.isEmpty())
              {
                  qDebug() << "刪除文件或目錄: " << deleteFile;
      
                  foreach(QString file, deleteFile)
                  {
                      // 處理操作每個被刪除的文件....
                  }
              }
          }
      }
      

      同理,當文件被修改時則調用fileUpdated函數,只需要去除絕對路徑與文件名即可,如下代碼所示;

      void FileSystemWatcher::fileUpdated(const QString &path)
      {
          QFileInfo file(path);
          QString strPath = file.absolutePath();
          QString strName = file.fileName();
      
         qDebug() << QString("文件 %1 路徑 %2 修改").arg(strName).arg(strPath);
      }
      

      你可以自行運行課件FileSystemWatcher.zip來觀察監控效果,如下圖;

      posted @ 2024-03-08 16:53  lyshark  閱讀(1212)  評論(0)    收藏  舉報
      主站蜘蛛池模板: av在线中文字幕不卡电影网| 亚洲AV无码成H人动漫无遮挡| 人妻激情偷乱一区二区三区| 国产欧美一区二区精品性色| 色悠悠久久精品综合视频| 中国帅小伙gaysextubevideo| 动漫av网站免费观看| 久久精品夜色噜噜亚洲aa| 亚洲天堂av日韩精品| 久久a级片| 国产黄色一区二区三区四区 | 国产av综合一区二区三区| av在线网站手机播放| 亚洲精品国产中文字幕| 丝袜a∨在线一区二区三区不卡| 成人av午夜在线观看| 男受被做哭激烈娇喘gv视频 | 久久精品国产清自在天天线| 国产四虎永久免费观看| 亚洲精品沙发午睡系列| 国产熟睡乱子伦午夜视频| 午夜久久一区二区狠狠干| 婷婷综合亚洲| 欧美高清freexxxx性| 一本一道av中文字幕无码| 国产成人精品午夜2022| 激情文学一区二区国产区| 中文字幕第一页亚洲精品| 国产精品免费观在线| 欧美福利电影A在线播放| 久久伊99综合婷婷久久伊| 日产精品99久久久久久| 乌克兰丰满女人a级毛片右手影院 人妻中文字幕不卡精品 | 欧美性猛交xxxx乱大交丰满| 制服丝袜中文字幕在线| 粉嫩国产一区二区三区在线| 国产首页一区二区不卡| 国精产品一品二品国精在线观看| 国产亚洲精品第一综合麻豆| 国产成人午夜一区二区三区| 国产又大又黑又粗免费视频|