parent
78ac0ca45e
commit
0b09242ac0
2 changed files with 74 additions and 0 deletions
@ -0,0 +1,47 @@ |
||||
#include "file_watcher.h" |
||||
|
||||
FileWatcher::FileWatcher(std::string path, TimeSpan<Millisecond> ts) |
||||
: target(path), ttm(ts) |
||||
{ |
||||
for (const std::filesystem::directory_entry& file : std::filesystem::recursive_directory_iterator(target)) |
||||
paths[file.path().string()] = std::filesystem::last_write_time(file); |
||||
} |
||||
|
||||
FileWatcher::~FileWatcher() { stop(); } |
||||
|
||||
void FileWatcher::start(const std::function<void (std::string, FileStatus)>& action) |
||||
{ |
||||
std::function<void()> task([&]() |
||||
{ |
||||
auto it = paths.begin(); |
||||
while (it != paths.end()) |
||||
{ |
||||
if (!std::filesystem::exists(it->first))
|
||||
{ |
||||
action(it->first, FileStatus::Deleted); |
||||
it = paths.erase(it); |
||||
} |
||||
else it++; |
||||
} |
||||
for (const std::filesystem::directory_entry& file : std::filesystem::recursive_directory_iterator(target)) |
||||
{ |
||||
auto current_file_last_write_time = std::filesystem::last_write_time(file); |
||||
if (contains(file.path().string())) |
||||
{ |
||||
if(paths[file.path().string()] != current_file_last_write_time) { |
||||
paths[file.path().string()] = current_file_last_write_time; |
||||
action(file.path().string(), FileStatus::Modified); |
||||
} |
||||
} else
|
||||
{ |
||||
paths[file.path().string()] = current_file_last_write_time; |
||||
action(file.path().string(), FileStatus::Created); |
||||
} |
||||
} |
||||
}); |
||||
ttm.start(std::make_unique<std::function<void()>>(task)); |
||||
} |
||||
|
||||
void FileWatcher::stop() { ttm.stop(); } |
||||
|
||||
bool FileWatcher::contains(std::string path) { return paths.find(path) != paths.end(); } |
@ -0,0 +1,27 @@ |
||||
#pragma once |
||||
|
||||
#include <bakatools.h> |
||||
#include <bakatools/thread/task_timer.h> |
||||
|
||||
enum class FileStatus |
||||
{ |
||||
Created = 0, |
||||
Modified = 1, |
||||
Deleted = 2, |
||||
}; |
||||
|
||||
class FileWatcher |
||||
{ |
||||
public: |
||||
FileWatcher(std::string path, TimeSpan<Millisecond> ts); |
||||
~FileWatcher(); |
||||
|
||||
void start(const std::function<void (std::string, FileStatus)>& action); |
||||
void stop(); |
||||
bool contains(std::string path); |
||||
|
||||
private: |
||||
std::string target; |
||||
std::unordered_map<std::string, std::filesystem::file_time_type> paths; |
||||
TaskTimer<Millisecond> ttm; |
||||
}; |
Loading…
Reference in New Issue