1#ifndef MSTL_CORE_FILE_FILE_WATCHER_HPP__
2#define MSTL_CORE_FILE_FILE_WATCHER_HPP__
3#include "MSTL/core/container/vector.hpp"
11class MSTL_API file_watcher {
13 using callback_t = function<void(
const path&, FILE_WATCH_EVENT)>;
16 _MSTL path watch_path_;
18 atomic<bool> watching_{
false};
19 atomic<bool> stopping_{
false};
21 FILE_WATCH_EVENT current_events_{FILE_WATCH_EVENT::ALL};
23 mutex callback_mutex_;
25#ifdef MSTL_PLATFORM_WINDOWS__
26 ::HANDLE dir_handle_ = INVALID_HANDLE_VALUE;
27 ::HANDLE completion_port_ = INVALID_HANDLE_VALUE;
28 ::OVERLAPPED overlapped_{};
29#elif defined(MSTL_PLATFORM_LINUX__)
31 int watch_descriptor_ = -1;
37 void watch_thread_func();
40 explicit file_watcher(
const path& watch_path,
bool recursive =
false);
43 file_watcher(
const file_watcher&) =
delete;
44 file_watcher& operator =(
const file_watcher&) =
delete;
46 bool start(callback_t callback, FILE_WATCH_EVENT events = FILE_WATCH_EVENT::ALL);
49 const path& watch_path() const noexcept {
return watch_path_; }
50 FILE_WATCH_EVENT current_events() const noexcept {
return current_events_; }
52 bool is_watching() const noexcept {
return watching_.
load(); }
53 bool is_recursive() const noexcept {
return recursive_; }
55 bool update_watch(FILE_WATCH_EVENT events);
56 bool update_recursive(
bool recursive);
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
T load(const memory_order mo=memory_order_seq_cst) const noexcept
原子加载操作