C++之监控文件是否被修改

软件开发过程中经常会用到配置文件,某些应用场景要求在软件运行时动态修改配置文件,此时就需要监控配置文件是否被修改,如果修改了,重新加载。

FileWatcher.h

#ifndef FILEWATCHER_H
#define FILEWATCHER_H

#include <ctime>
#include <chrono>
#include <string>
#include <thread>
#include <atomic>

typedef std::chrono::system_clock Clock;
typedef std::chrono::duration<long long, std::micro> Duration;
typedef std::chrono::time_point<Clock, Duration> Time;

template <typename FromDuration>
inline Time time_cast (std::chrono::time_point<Clock, FromDuration> const & tp)
{
    return std::chrono::time_point_cast<Duration, Clock> (tp);
}

inline Time now ()
{
    return time_cast(Clock::now ());
}

inline Time from_time_t (time_t t_time)
{
    return time_cast(Clock::from_time_t (t_time));
}

struct FileInfo
{
    Time mtime;
    off_t size;
};

class FileWatcher
{
public:
    FileWatcher(const std::string& file, unsigned int millis);
    ~FileWatcher();

protected:
    void run();

private:
    bool checkForFileModification();
    void updateLastModInfo();
    bool getFileInfo(FileInfo *fi, const std::string &name);

private:
    FileInfo m_lastFileInfo;
    std::string m_file;
    unsigned int const m_waitMillis;
    std::atomic_bool m_stopped;
    std::thread m_thread;
};

#endif // FILEWATCHER_H

FileWatcher.cpp

#include "FileWatcher.h"
#include "tchar.h"
#include "iostream"

FileWatcher::FileWatcher(const std::string& file, unsigned int millis)
    : m_file(file)
    , m_waitMillis(millis)
    , m_stopped(false)
    , m_thread(&FileWatcher::run, this)
{
    m_lastFileInfo.mtime = time_cast(Clock::now ());
    m_lastFileInfo.size = 0;

    updateLastModInfo();
}

FileWatcher::~FileWatcher()
{
     m_stopped = true;
     if (m_thread.joinable())
     {
         m_thread.join();
     }
}

void FileWatcher::run()
{
    while (!m_stopped)
    {
        bool modified = checkForFileModification();
        if(modified)
        {
            updateLastModInfo();
            std::cout << "File changed" << std::endl;
        }

        std::this_thread::sleep_for(std::chrono::milliseconds(m_waitMillis));
    }
}

bool FileWatcher::checkForFileModification()
{
    FileInfo fi;

    if (!getFileInfo(&fi, m_file) )
    {
        return false;
    }

    bool modified = fi.mtime > m_lastFileInfo.mtime
            || fi.size != m_lastFileInfo.size;


    return modified;
}

void FileWatcher::updateLastModInfo()
{
    FileInfo fi;

    if (getFileInfo(&fi, m_file))
    {
        m_lastFileInfo = fi;
    }
}

bool FileWatcher::getFileInfo(FileInfo *fi, const std::string &name)
{
    struct _stat fileStatus;
    if (_stat(name.c_str (), &fileStatus) == -1)
    {
        return false;
    }

    fi->mtime = from_time_t(fileStatus.st_mtime);
    fi->size = fileStatus.st_size;

    return true;
}

main.cpp

#include "FileWatcher.h"

#include <iostream>

int main(int argc, char *argv[])
{
    char filePath[1024] = {0};
    // 获取绝对路径.
    _fullpath(filePath, "config.txt", 1024);
    std::cout <<filePath << std::endl;
    FileWatcher fw(filePath, 1000);
    system("pause");
    
    return 0;
}

这里config.txt和可执行文件同一目录,每次修改config.txt,就会打印File changed

原文链接:https://blog.csdn.net/caoshangpa/article/details/128881339

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草上爬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值