Advertisement
Guest User

Untitled

a guest
Jul 20th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. vector <string> checkForChanges(string dir) {
  2.     DWORD returnedB;
  3.     BOOL result;
  4.     char buf[2048];
  5.     char file[MAX_PATH];
  6.     vector <string> allChanges;
  7.     chrono::time_point<chrono::system_clock> start, end, now;
  8.  
  9.     HANDLE hDir = CreateFile(dir.c_str(),
  10.         GENERIC_READ | GENERIC_WRITE | FILE_LIST_DIRECTORY,
  11.         FILE_SHARE_READ | FILE_SHARE_WRITE,
  12.         NULL,
  13.         OPEN_EXISTING,
  14.         FILE_FLAG_BACKUP_SEMANTICS,
  15.         NULL);
  16.     if (hDir == INVALID_HANDLE_VALUE)
  17.     {
  18.         cout << GetLastError() << endl;
  19.         return allChanges;
  20.     }
  21.  
  22.     FILE_NOTIFY_INFORMATION *pNotify = (FILE_NOTIFY_INFORMATION*)buf;
  23.     start = chrono::system_clock::now(); // Запоминаем текущее время
  24.     end += chrono::seconds(60); // Время до конца работы цикла
  25.     while (now < end)
  26.     {
  27.         now = chrono::system_clock::now(); // Сверяем время, что бы выйти из цикла после истечения 60 секунд
  28.  
  29.         result = ReadDirectoryChangesW(hDir,
  30.             &buf,
  31.             sizeof(buf),
  32.             TRUE,
  33.             FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_DIR_NAME,
  34.             &returnedB,
  35.             NULL,
  36.             NULL);
  37.         if (result) // Получили сообщение об изменении в отслеживаемой директории
  38.         {
  39.             memset(file, 0, strlen(file)); // Убираем мусор что бы не возникали лишние символы (Что будет без этого: Новая папкаМММММММММ)
  40.             WideCharToMultiByte(CP_ACP, 0, pNotify->FileName, pNotify->FileNameLength / 2, file, 99, NULL, NULL); // Переводит wchar от FILE_NOTIFY_INFORMATION в char
  41.             switch (pNotify->Action)
  42.             {
  43.             case FILE_ACTION_ADDED: // Если был добавлен файл или папка
  44.             {
  45.                 string addChange = "File Added: ", to_string(file);
  46.                 allChanges.push_back(addChange);
  47.                 break;
  48.             }
  49.             case FILE_ACTION_REMOVED: // Если удален файл или папка
  50.             {
  51.                 string remChange = "File Deleted: ",  to_string(file);
  52.                 allChanges.push_back(remChange);
  53.                 break;
  54.             }
  55.             case FILE_ACTION_MODIFIED: // Если изменили файл (записали/удалили содержимое)
  56.             {
  57.                 string modChange = "File Modified: ", to_string(file);
  58.                 allChanges.push_back(modChange);
  59.                 break;
  60.             }
  61.             case FILE_ACTION_RENAMED_OLD_NAME: // Если переименовали файл или папку
  62.             {
  63.                 string renChange = "File Renamed: ", to_string(file);
  64.                 allChanges.push_back(renChange);
  65.                 break;
  66.             }
  67.             }
  68.         }
  69.     }
  70.     for (const auto& str : allChanges) // Вывод всех изменений за 60 секунд
  71.     {
  72.         cout << str << endl;
  73.     }
  74.     CloseHandle(hDir);
  75.     return allChanges;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement