1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
   | #include <windows.h>
#include <string>
#include <iostream>
 
void WatchDirectory(LPTSTR lpDir);
int main()
{
   TCHAR Directory[MAX_PATH];
   GetCurrentDirectory(MAX_PATH,Directory);
   WatchDirectory(Directory);
 
   return 0;
}
 
struct ScopedLockHandle
{
   ScopedLockHandle(HANDLE h_)
      :m_handle(h_)
   {}
   ~ScopedLockHandle()
   {CloseHandle(m_handle);}
private:
   HANDLE m_handle;
};
 
void WatchDirectory(LPTSTR lpDir)
{
  HANDLE hDir = CreateFile( 
    lpDir,
    FILE_LIST_DIRECTORY,
    FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS,
    NULL
  );
  if(hDir){
     ScopedLockHandle scoped(hDir);
     const unsigned nbr_item=1024;
     FILE_NOTIFY_INFORMATION Buffer[nbr_item];
     DWORD BytesReturned;
     while( ReadDirectoryChangesW(
        hDir,
        &Buffer,
        sizeof(Buffer),
        TRUE, /* monitoring option */
        FILE_NOTIFY_CHANGE_SECURITY|
        FILE_NOTIFY_CHANGE_CREATION|
        FILE_NOTIFY_CHANGE_LAST_ACCESS|
        FILE_NOTIFY_CHANGE_LAST_WRITE|
        FILE_NOTIFY_CHANGE_SIZE|
        FILE_NOTIFY_CHANGE_ATTRIBUTES|
        FILE_NOTIFY_CHANGE_DIR_NAME|
        FILE_NOTIFY_CHANGE_FILE_NAME, /* filter conditions */
        &BytesReturned, /* bytes returned */
        NULL, /* overlapped buffer */
        NULL))
     {
        FILE_NOTIFY_INFORMATION *p_cur = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(&Buffer[0]);
        do{
           switch(p_cur->Action)
           {
           case FILE_ACTION_ADDED:
              std::wcout<<L"File added : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
              break;
           case FILE_ACTION_REMOVED:
              std::wcout<<L"File removed : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
              break;
           case FILE_ACTION_MODIFIED :
              std::wcout<<L"File modified : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
              break;
           case FILE_ACTION_RENAMED_OLD_NAME :
              std::wcout<<L"File renamed old name : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
              break;
           case FILE_ACTION_RENAMED_NEW_NAME :
              std::wcout<<L"File rename new name : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
              break;
           default:
              std::wcout<<L"File unknown : "<<std::wstring(p_cur->FileName,p_cur->FileNameLength/sizeof(p_cur->FileName[0]))<<std::endl;
              break;
           }
           p_cur = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(reinterpret_cast<unsigned char*>(p_cur) + p_cur->NextEntryOffset);
        }while(p_cur->NextEntryOffset>0);
     }
  }
} | 
Partager