diff --git a/file_monitor.cpp b/file_monitor.cpp new file mode 100644 index 0000000..cfd154f --- /dev/null +++ b/file_monitor.cpp @@ -0,0 +1,54 @@ +#include "file_monitor.h" +#include +#include +#include + +FileMonitor::FileMonitor(const std::string& root_path, FileCallback callback) + : root_path_(root_path), callback_(std::move(callback)) {} + +FileMonitor::~FileMonitor() { + stop(); +} + +void FileMonitor::start() { + running_ = true; + monitor_thread_ = std::thread(&FileMonitor::monitor_thread, this); +} + +void FileMonitor::stop() { + running_ = false; + if (monitor_thread_.joinable()) { + monitor_thread_.join(); + } +} + +void FileMonitor::monitor_thread() { + while (running_) { + scan_directory(root_path_); + std::this_thread::sleep_for(std::chrono::seconds(1)); + } +} + +void FileMonitor::scan_directory(const fs::path& dir) { + for (const auto& entry : fs::recursive_directory_iterator(dir)) { + if (!entry.is_regular_file()) continue; + + const auto& path = entry.path(); + auto last_write_time = fs::last_write_time(path); + + // 检查文件是否被修改 + auto it = file_times_.find(path.string()); + if (it == file_times_.end() || it->second != last_write_time) { + std::string content = read_file_content(path); + callback_(path.string(), content); + file_times_[path.string()] = last_write_time; + } + } +} + +std::string FileMonitor::read_file_content(const fs::path& path) { + std::ifstream file(path, std::ios::binary); + std::stringstream buffer; + buffer << file.rdbuf(); + return buffer.str(); +} \ No newline at end of file