当前位置: 代码网 > it编程>编程语言>C/C++ > C/C++ Qt监控文件状态变化方式

C/C++ Qt监控文件状态变化方式

2025年10月22日 C/C++ 我要评论
c++ qt监控文件状态变化qfilesystemwatcher 是 qt 框架中的一个类,用于监视文件和目录的变化。它提供了一种机制,可以在文件系统中的特定文件或目录发生变化时通知应用程序。以下是

c++ qt监控文件状态变化

qfilesystemwatcher 是 qt 框架中的一个类,用于监视文件和目录的变化。

它提供了一种机制,可以在文件系统中的特定文件或目录发生变化时通知应用程序。

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

  • 文件和目录监视: qfilesystemwatcher 可以监视一个或多个文件和目录,以便在它们发生变化时接收通知。
  • 变化类型: 支持的变化类型包括文件或目录的创建、修改、删除等。
  • 异步通知: 当被监视的文件或目录发生变化时,qfilesystemwatcher 会发出相应的信号,例如 filechangeddirectorychanged 信号。
  • 跨平台支持: 可在不同平台上运行,包括 windows、linux、和 macos 等。
  • 简单易用: 使用方便,只需连接相应的信号槽即可处理文件系统变化的通知。

在示例中,qfilesystemwatcher 被用于监视文件和目录的变化。

当文件内容被修改或目录中的文件被删除时,相应的信号槽会被触发,从而执行相应的操作。

定义头文件 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);  // 目录更新时调用,path是监控的路径
    void fileupdated(const qstring &path);   // 文件被修改时调用,path是监控的路径

private:
    explicit filesystemwatcher(qobject *parent = 0);

private:
    static filesystemwatcher *m_pinstance; // 单例
    qfilesystemwatcher *m_psystemwatcher;  // qfilesystemwatcher变量
    qmap<qstring, qstringlist> m_currentcontentsmap; // 当前每个监控的内容目录列表

};
#endif // filesystem_h

实现头文件 filesystem.cpp

#include <qdir>
#include <qfileinfo>
#include <qdebug>
#include "filesystem.h"

filesystemwatcher* filesystemwatcher::m_pinstance = null;
filesystemwatcher::filesystemwatcher(qobject *parent)
    : qobject(parent)
{

}

// 监控文件或目录
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信号到相应的槽
        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);
    }
}

// 只要任何监控的目录更新(添加、删除、重命名),就会调用。
void filesystemwatcher::directoryupdated(const qstring &path)
{
    qdebug() << qstring("directory updated: %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("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)
            {
                // 处理操作每个新文件....
            }
        }

        // 从dir中删除文件/目录
        if (!deletefile.isempty())
        {
            qdebug() << "files/dirs deleted: " << deletefile;

            foreach(qstring file, deletefile)
            {
                // 处理操作每个被删除的文件....
            }
        }
    }
}

// 文件修改时调用
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代码中

直接调用

filesystemwatcher::addwatchpath("c://test");

监控c盘下的test目录,当有文件发生变化时自动触发。

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

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

    filesystemwatcher::addwatchpath("c://test");

    return a.exec();
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com