parent
							
								
									46284efe28
								
							
						
					
					
						commit
						2f2a11dda1
					
				
				 4 changed files with 147 additions and 141 deletions
			
			
		| @ -1,47 +1,49 @@ | ||||
| #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); | ||||
| } | ||||
| namespace Bk::Tools { | ||||
|     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(); } | ||||
|     FileWatcher::~FileWatcher() { stop(); } | ||||
| 
 | ||||
| void FileWatcher::start(const std::function<void (std::string, FileStatus)>& action) | ||||
| { | ||||
|     std::function<void()> task([&]() | ||||
|     void FileWatcher::start(const std::function<void (std::string, FileStatus)>& action) | ||||
|     { | ||||
|         auto it = paths.begin(); | ||||
|         while (it != paths.end()) | ||||
|         std::function<void()> task([&]() | ||||
|         { | ||||
|             if (!std::filesystem::exists(it->first)) 
 | ||||
|             auto it = paths.begin(); | ||||
|             while (it != paths.end()) | ||||
|             { | ||||
|                 action(it->first, FileStatus::Deleted); | ||||
|                 it = paths.erase(it); | ||||
|                 if (!std::filesystem::exists(it->first)) 
 | ||||
|                 { | ||||
|                     action(it->first, FileStatus::Deleted); | ||||
|                     it = paths.erase(it); | ||||
|                 } | ||||
|                 else 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())) | ||||
|             for (const std::filesystem::directory_entry& file : std::filesystem::recursive_directory_iterator(target)) | ||||
|             { | ||||
|                 if(paths[file.path().string()] != current_file_last_write_time) { | ||||
|                 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::Modified); | ||||
|                     action(file.path().string(), FileStatus::Created); | ||||
|                 } | ||||
|             } 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)); | ||||
| } | ||||
|         }); | ||||
|         ttm.start(std::make_unique<std::function<void()>>(task)); | ||||
|     } | ||||
| 
 | ||||
| void FileWatcher::stop() { ttm.stop(); } | ||||
|     void FileWatcher::stop() { ttm.stop(); } | ||||
| 
 | ||||
| bool FileWatcher::contains(std::string path) { return paths.find(path) != paths.end(); } | ||||
|     bool FileWatcher::contains(std::string path) { return paths.find(path) != paths.end(); } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue