Advertisement
claudious

filewatcher

Dec 14th, 2020 (edited)
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.78 KB | None | 0 0
  1. #include "pfw/FileSystemWatcher.h"
  2.  
  3. #include <bitset>
  4. #include <chrono>
  5. #include <filesystem>
  6. #include <memory>
  7.  
  8. class Listener
  9. {
  10. public:
  11.     Listener(std::filesystem::path path):
  12.             path(path)
  13.     {
  14.         _watcher = std::make_unique<pfw::FileSystemWatcher>(
  15.                 path, std::chrono::milliseconds(10),
  16.                 std::bind(&Listener::listenerFunction, this,
  17.                           std::placeholders::_1));
  18.     }
  19.     void listenerFunction(std::vector<pfw::EventPtr> events)
  20.     {
  21.         if (events.at(0)->relativePath == ".files.json") {
  22.             // blacklist delle modifiche alla lista dei file
  23.             return;
  24.         }
  25.  
  26.         if (events.size() == 2 && events.at(0)->type == (pfw::EventType::DELETED | pfw::EventType::RENAMED)
  27.             && events.at(1)->type == (pfw::EventType::CREATED | pfw::EventType::RENAMED)
  28.                 ) {
  29.             // move/rename in linux
  30.             std::cout << events.at(0)->relativePath << " has been moved/renamed to "
  31.                       << events.at(1)->relativePath << std::endl;
  32.             // gestione dell'evento
  33.             return;
  34.         }
  35.  
  36.         if (events.size() == 3 && events.at(0)->type == pfw::EventType::DELETED
  37.             && events.at(1)->type == pfw::EventType::CREATED
  38.             && events.at(2)->type == pfw::EventType::MODIFIED
  39.                 ) {
  40.             // move/rename in windows
  41.             std::cout << events.at(0)->relativePath << " has been moved/renamed to "
  42.                       << events.at(1)->relativePath << std::endl;
  43.             // gestione dell'evento
  44.             return;
  45.         }
  46.  
  47.         for (const auto &event : events) {
  48.  
  49.             if (event->type == pfw::EventType::DELETED) {
  50.                 std::cout << event->relativePath << " has been deleted." << std::endl;
  51.                 // gestione dell'evento
  52.             } else if (event->type == pfw::EventType::MODIFIED) {
  53.                 // gestione dell'evento
  54.                 auto p = this->path / event->relativePath;
  55.                 if (std::filesystem::is_regular_file(p)) {
  56.                     auto size = std::filesystem::file_size(p);
  57.                     std::this_thread::sleep_for(std::chrono::milliseconds(10));
  58.                     if (size == std::filesystem::file_size(p) ) {
  59.                         std::cout << "finished! size is " << size << std::endl;
  60.                     } else {
  61.                         std::cout << event->relativePath << " is being modified." << std::endl;
  62.                         //std::cout << "file size is: " << std::filesystem::file_size(p) << std::endl;
  63.                     }
  64.  
  65.                 }
  66.             } else if (event->type == pfw::EventType::CREATED) {
  67.                 std::cout << event->relativePath << " has been created." << std::endl;
  68.                 // gestione dell'evento
  69.                 auto p = this->path / event->relativePath;
  70.                 if (std::filesystem::is_regular_file(p)) {
  71.                     auto size = std::filesystem::file_size(p);
  72.                     std::this_thread::sleep_for(std::chrono::milliseconds(10));
  73.                     if (size == std::filesystem::file_size(p) ) {
  74.                         std::cout << "finished! size is " << size << std::endl;
  75.                     } else {
  76.                         std::cout << "file is being created, current size is: " << std::filesystem::file_size(p) << std::endl;
  77.                     }
  78.  
  79.                 }
  80.             }
  81.             if (event->type == (pfw::EventType::CREATED | pfw::EventType::MODIFIED)) {
  82.                 std::cout << event->relativePath << " has been created/copied." << std::endl;
  83.                 // gestione dell'evento
  84.                 auto p = this->path / event->relativePath;
  85.                 if (std::filesystem::is_regular_file(p)) {
  86.                     auto size = std::filesystem::file_size(p);
  87.                     std::this_thread::sleep_for(std::chrono::milliseconds(10));
  88.                     if (size == std::filesystem::file_size(p) ) {
  89.                         std::cout << "finished! size is " << size << std::endl;
  90.                     } else {
  91.                         std::cout << "file size is: " << std::filesystem::file_size(p) << std::endl;
  92.                     }
  93.  
  94.                 }
  95.             }
  96.         }
  97.     }
  98.  
  99. private:
  100.     std::filesystem::path path;
  101.     std::unique_ptr<pfw::FileSystemWatcher> _watcher;
  102. };
  103.  
  104. int main(int argc, char *argv[])
  105. {
  106.     if (argc < 2) {
  107.         std::cout << "one input parameter is needed" << std::endl;
  108.     }
  109.  
  110.     const auto path = std::filesystem::path(argv[1]);
  111.  
  112.     std::cout << "observed path is '" << path.string() << "'" << std::endl;
  113.  
  114.     auto listenerInstance = Listener(path);
  115.  
  116.     std::cout << "Press any key to finish the observation!" << std::endl;
  117.     std::cin.ignore();
  118.  
  119.     return 0;
  120. }
  121.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement