最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++ Qt監(jiān)控文件狀態(tài)變化方式

 更新時(shí)間:2025年10月22日 09:12:10   作者:王瑞MVP  
本文介紹了Qt框架中的QFileSystemWatcher類,講解其用于跨平臺(tái)監(jiān)控文件和目錄變化的功能及用法,包含信號(hào)槽機(jī)制實(shí)現(xiàn)自動(dòng)通知,示例展示了如何監(jiān)控指定目錄并響應(yīng)文件變動(dòng)

C++ Qt監(jiān)控文件狀態(tài)變化

QFileSystemWatcher 是 Qt 框架中的一個(gè)類,用于監(jiān)視文件和目錄的變化。

它提供了一種機(jī)制,可以在文件系統(tǒng)中的特定文件或目錄發(fā)生變化時(shí)通知應(yīng)用程序。

以下是 QFileSystemWatcher 的主要特性和用法:

  • 文件和目錄監(jiān)視: QFileSystemWatcher 可以監(jiān)視一個(gè)或多個(gè)文件和目錄,以便在它們發(fā)生變化時(shí)接收通知。
  • 變化類型: 支持的變化類型包括文件或目錄的創(chuàng)建、修改、刪除等。
  • 異步通知: 當(dāng)被監(jiān)視的文件或目錄發(fā)生變化時(shí),QFileSystemWatcher 會(huì)發(fā)出相應(yīng)的信號(hào),例如 fileChangeddirectoryChanged 信號(hào)。
  • 跨平臺(tái)支持: 可在不同平臺(tái)上運(yùn)行,包括 Windows、Linux、和 macOS 等。
  • 簡(jiǎn)單易用: 使用方便,只需連接相應(yīng)的信號(hào)槽即可處理文件系統(tǒng)變化的通知。

在示例中,QFileSystemWatcher 被用于監(jiān)視文件和目錄的變化。

當(dāng)文件內(nèi)容被修改或目錄中的文件被刪除時(shí),相應(yīng)的信號(hào)槽會(huì)被觸發(fā),從而執(zhí)行相應(yīng)的操作。

定義頭文件 filesystem.h

#ifndef FILESYSTEM_H
#define FILESYSTEM_H
#include <QObject>
#include <QMap>
#include <QFileSystemWatcher>

class FileSystemWatcher : public QObject
{
    Q_OBJECT

public:
    static void addWatchPath(QString path);

public slots:
    void directoryUpdated(const QString &path);  // 目錄更新時(shí)調(diào)用,path是監(jiān)控的路徑
    void fileUpdated(const QString &path);   // 文件被修改時(shí)調(diào)用,path是監(jiān)控的路徑

private:
    explicit FileSystemWatcher(QObject *parent = 0);

private:
    static FileSystemWatcher *m_pInstance; // 單例
    QFileSystemWatcher *m_pSystemWatcher;  // QFileSystemWatcher變量
    QMap<QString, QStringList> m_currentContentsMap; // 當(dāng)前每個(gè)監(jiān)控的內(nèi)容目錄列表

};
#endif // FILESYSTEM_H

實(shí)現(xiàn)頭文件 filesystem.cpp

#include <QDir>
#include <QFileInfo>
#include <qDebug>
#include "filesystem.h"

FileSystemWatcher* FileSystemWatcher::m_pInstance = NULL;
FileSystemWatcher::FileSystemWatcher(QObject *parent)
    : QObject(parent)
{

}

// 監(jiān)控文件或目錄
void FileSystemWatcher::addWatchPath(QString path)
{
    qDebug() << QString("Add to watch: %1").arg(path);

    if (m_pInstance == NULL)
    {
        m_pInstance = new FileSystemWatcher();
        m_pInstance->m_pSystemWatcher = new QFileSystemWatcher();

        // 連接QFileSystemWatcher的directoryChanged和fileChanged信號(hào)到相應(yīng)的槽
        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)));
    }

    // 添加監(jiān)控路徑
    m_pInstance->m_pSystemWatcher->addPath(path);

    // 如果添加路徑是一個(gè)目錄,保存當(dāng)前內(nèi)容列表
    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);
    }
}

// 只要任何監(jiān)控的目錄更新(添加、刪除、重命名),就會(huì)調(diào)用。
void FileSystemWatcher::directoryUpdated(const QString &path)
{
    qDebug() << QString("Directory updated: %1").arg(path);

    // 比較最新的內(nèi)容和保存的內(nèi)容找出區(qū)別(變化)
    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();

    // 更新當(dāng)前設(shè)置
    m_currentContentsMap[path] = newEntryList;

    if (!newFile.isEmpty() && !deleteFile.isEmpty())
    {
        // 文件/目錄重命名
        if ((newFile.count() == 1) && (deleteFile.count() == 1))
        {
            qDebug() << QString("File Renamed from %1 to %2").arg(deleteFile.first()).arg(newFile.first());
        }
    }
    else
    {
        // 添加新文件/目錄至Dir
        if (!newFile.isEmpty())
        {
            qDebug() << "New Files/Dirs added: " << newFile;

            foreach (QString file, newFile)
            {
                // 處理操作每個(gè)新文件....
            }
        }

        // 從Dir中刪除文件/目錄
        if (!deleteFile.isEmpty())
        {
            qDebug() << "Files/Dirs deleted: " << deleteFile;

            foreach(QString file, deleteFile)
            {
                // 處理操作每個(gè)被刪除的文件....
            }
        }
    }
}

// 文件修改時(shí)調(diào)用
void FileSystemWatcher::fileUpdated(const QString &path)
{
    QFileInfo file(path);
    QString strPath = file.absolutePath();
    QString strName = file.fileName();

    qDebug() << QString("The file %1 at path %2 is updated").arg(strName).arg(strPath);
}

主程序main.cpp代碼中

直接調(diào)用

FileSystemWatcher::addWatchPath("c://test");

監(jiān)控C盤下的test目錄,當(dāng)有文件發(fā)生變化時(shí)自動(dòng)觸發(fā)。

#include <QCoreApplication>
#include "filesystem.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    FileSystemWatcher::addWatchPath("c://test");

    return a.exec();
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法

    C語言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法

    這篇文章主要介紹了C語言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法,本文通過代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 文件編譯時(shí)出現(xiàn)multiple definition of ''xxxxxx''的具體解決方法

    文件編譯時(shí)出現(xiàn)multiple definition of ''xxxxxx''的具體解決方法

    以下是對(duì)文件編譯時(shí)出現(xiàn)multiple definition of 'xxxxxx'的解決方法進(jìn)行了詳細(xì)的分析介紹,如也遇到此問題的朋友們可以過來參考下
    2013-07-07
  • C/C++實(shí)現(xiàn)內(nèi)存泄漏檢測(cè)詳解

    C/C++實(shí)現(xiàn)內(nèi)存泄漏檢測(cè)詳解

    這篇文章主要為大家詳細(xì)介紹了c++進(jìn)行內(nèi)存泄漏檢測(cè)的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2023-02-02
  • C語言 操作符分類解析與使用

    C語言 操作符分類解析與使用

    C 語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,邏輯操作符,逗號(hào)表達(dá)式。讓我們通讀本篇來詳細(xì)了解吧
    2021-11-11
  • Qt事件過濾實(shí)現(xiàn)點(diǎn)擊圖片的放大和縮小

    Qt事件過濾實(shí)現(xiàn)點(diǎn)擊圖片的放大和縮小

    這篇文章主要為大家詳細(xì)介紹了Qt事件過濾實(shí)現(xiàn)點(diǎn)擊圖片的放大和縮小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ string字符串的修改與替換方法詳析

    C++ string字符串的修改與替換方法詳析

    這篇文章主要給大家介紹了關(guān)于C++ string字符串修改與替換方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C語言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng)

    C語言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單的學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++中的數(shù)組引用和指針引用

    C++中的數(shù)組引用和指針引用

    這篇文章主要介紹了C++中的數(shù)組引用和指針引用詳細(xì)的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • 解析c中stdout與stderr容易忽視的一些細(xì)節(jié)

    解析c中stdout與stderr容易忽視的一些細(xì)節(jié)

    本篇文章是對(duì)在c語言中stdout與stderr容易忽視的一些細(xì)節(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++線程池實(shí)現(xiàn)

    C++線程池實(shí)現(xiàn)

    線程池是一種并發(fā)編程技術(shù),通過預(yù)先創(chuàng)建一組線程并復(fù)用它們來執(zhí)行多個(gè)任務(wù),避免了頻繁創(chuàng)建和銷毀線程的開銷,本文就來介紹一下C++線程池實(shí)現(xiàn),感興趣的可以了解一下
    2025-02-02

最新評(píng)論

山阳县| 昆明市| 漳州市| 易门县| 丹东市| 青阳县| 连平县| 赞皇县| 乌拉特后旗| 丹江口市| 海丰县| 宜良县| 旬邑县| 壶关县| 阿拉善右旗| 达尔| 前郭尔| 娱乐| 华蓥市| 鄂州市| 建昌县| 响水县| 托克托县| 淳安县| 武冈市| 乾安县| 高尔夫| 洛浦县| 绍兴市| 玛多县| 平远县| 河间市| 江达县| 青川县| 乌兰浩特市| 赤城县| 营山县| 赤峰市| 靖安县| 如皋市| 万州区|