DirectoryWatcher - FILE_NOTIFY_INFORMATION structure



  • Hallo zusammen,

    ich versuche mich daran einen DirectoryWatcher zu überarbeiten.
    Nun tritt bei u.g. Code das Problem auf, dass zwar die Umbenennung von
    Dateien korrekt angezeigt wird, jedoch der neue Name eines Ordners nicht
    ausgegeben wird.

    Aktion: c:\test\a wird in c:\test\b umbenannt
    Output: renamed c:\test\a

    Ich hätte hier noch den neuen Namen des Ordners erwartet 😕

    CString m_dir("c:\\test");
     HANDLE hDir = CreateFile( CString(m_dir),   // pointer to the file path 
         FILE_LIST_DIRECTORY,                // access (read/write) mode
         FILE_SHARE_READ|FILE_SHARE_WRITE,  // share mode
         NULL,                               // security descriptor
         OPEN_EXISTING,                      // how to create
         FILE_FLAG_BACKUP_SEMANTICS, //|FILE_FLAG_OVERLAPPED,         // file attributes
         NULL                                // file with attributes to copy
     );
    
     FILE_NOTIFY_INFORMATION Buffer[1024];
     DWORD BytesReturned;
     while (true) {
      int ret = ReadDirectoryChangesW(
          hDir,       // handle to directory
          &Buffer,      // read results buffer
          sizeof(Buffer),     // length of buffer
          TRUE,       // monitoring option
          // filter conditions
          FILE_NOTIFY_CHANGE_SECURITY|
          FILE_NOTIFY_CHANGE_SIZE|  // in file or subdir
          FILE_NOTIFY_CHANGE_ATTRIBUTES|
          FILE_NOTIFY_CHANGE_DIR_NAME| // creating, deleting a directory or sub
          FILE_NOTIFY_CHANGE_FILE_NAME, // renaming,creating,deleting a file
          &BytesReturned,     // bytes returned
          NULL,       // overlapped buffer
          NULL       // completion routine
      );
    
      CString filename = m_dir + "\\"+ CString(Buffer[0].FileName).Left(Buffer[0].FileNameLength / 2);
      switch(Buffer[0].Action)
      {
       case FILE_ACTION_ADDED: 
    	   MessageBox("added",filename);
        printf("%s\n+: %s\n","Triggered by add", filename);
        break; 
       case FILE_ACTION_REMOVED: 
    	   MessageBox("removed",filename);
    	   printf("%s\nx: %s\n","Triggered by removed", filename);
        break; 
       case FILE_ACTION_MODIFIED: 
    	   	   MessageBox("modified",filename);
        printf("%s\nm: %s\n","Triggered by modified", filename);
        break; 
       case FILE_ACTION_RENAMED_OLD_NAME: 
    	   	   	   MessageBox("renamed",filename);
        printf("%s\n%s -> %s\n","Triggered by rename", filename,
         CString(Buffer[1].FileName).Left(Buffer[1].FileNameLength / 2));
        break; 
       case FILE_ACTION_RENAMED_NEW_NAME: 
    	   	   	   MessageBox("renamed new",filename);
        printf("%s\n -> %s\n","Triggered by rename 2", filename);
        break;
      }
     }
     CloseHandle( hDir );
    


  • MSDN sagt:

    Directory changes that occur between calls to this function are added to
    the buffer and then returned with the next call.
    

    Es würde sich also evtl. lohnen nicht nur am Anfang des Buffers zu suchen ...

    switch(Buffer[0].Action)
    

    Ausserdem ist die Abfrage in einer Endlosschleife möglicherweise nicht so
    ganz sinnvoll.

    Möglicherweise wäre das hier interessant:

    Obtaining Directory Change Notifications

    http://msdn.microsoft.com/en-us/library/aa365261.aspx


Anmelden zum Antworten