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\aIch 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