Probleme mit Verzeichnis überwachen



  • Hey @all,

    ich habe hier folgendes Programm

    #define WIN32_LEAN_AND_MEAN
    #define _WIN32_WINNT 0x501
    #include <windows.h>
    #include <stdio.h>
    #include <winbase.h>
    void WatchDir()
    {
    	for(;;) {
    	BOOL bResult;
    	HANDLE hDir;
    	BYTE Buf[10000];
    	DWORD RetBytes;
    	FILE_NOTIFY_INFORMATION *pInfo;
    	DWORD i = 0;
    	WCHAR FileName[1000];
    
    	hDir = CreateFile(
    		L"C:\\OracleTest\\oracle\\flash_recovery_area\\WWGDCF\\BACKUPSET",
    		FILE_LIST_DIRECTORY,
    		FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    		NULL,
    		OPEN_EXISTING,
    		FILE_FLAG_BACKUP_SEMANTICS,
    		NULL);
    
    	bResult = ReadDirectoryChangesW(
    		hDir,
    		Buf,
    		10000,
    		TRUE,
    			FILE_NOTIFY_CHANGE_FILE_NAME		// Löschen, Erstellen oder Umbenennen
    										| FILE_NOTIFY_CHANGE_DIR_NAME		// Löschen oder Erstellen oder Umbenennen eines Verzeichnisses
    										| FILE_NOTIFY_CHANGE_SIZE			// Größe ändert sich
    										| FILE_NOTIFY_CHANGE_LAST_WRITE 	// Dateizeit Letzte Änderung
    										| FILE_NOTIFY_CHANGE_ATTRIBUTES	// Attribute geändert
    										| FILE_NOTIFY_CHANGE_LAST_ACCESS 	// Dateizeit Letzter Zugriff (auch Lesen)
    										| FILE_NOTIFY_CHANGE_CREATION 	// Dateizeit Erstellungsdatum ändert sich
    										| FILE_NOTIFY_CHANGE_SECURITY,
    		&RetBytes,
    		NULL,
    		NULL);
    
    	for(;;) {
    		pInfo = (FILE_NOTIFY_INFORMATION *)&Buf[i];
    		switch(pInfo->Action) {
    		case FILE_ACTION_ADDED: wprintf(L"file added: "); break;
    		case FILE_ACTION_REMOVED: wprintf(L"file deleted: "); break;
    		case FILE_ACTION_MODIFIED: wprintf(L"time stamp or attribute changed: "); break; 
    		case FILE_ACTION_RENAMED_OLD_NAME: wprintf(L"file name changed - old name: "); break;
    		case FILE_ACTION_RENAMED_NEW_NAME: wprintf(L"file name changed - new name: "); break;
    		default: wprintf(L"unknown event: ");
    		}
    
    		lstrcpyn(FileName, pInfo->FileName, pInfo->FileNameLength / sizeof(WCHAR) + 1);
    		FileName[pInfo->FileNameLength / sizeof(WCHAR) + 1] = '\0';
    		wprintf(L"%s\n", FileName);
    
    		if(pInfo->NextEntryOffset == 0) break;
    		i += pInfo->NextEntryOffset;
    	};
    
    	CloseHandle(hDir);
    }
    }
    
    int main() {
    	WatchDir();
    	return 0;
    }
    

    Mein Problem ist nun das ich nicht alleEvents abfange...
    Beispiel: Ich füge 15 Dateien hinzu (je 10 KB) von 01.dat bis 15.dat
    dann bekomme ich 15 file added Nachrichten.
    Beim löschen der 15 Dateien bekomme ich jedoch nur ca. 5 - 13 Meldungen... Woran liegt das?

    Hier mal die Ausgabe:

    file added: 01.png
    time stamp or attribute changed: 01.png
    time stamp or attribute changed: 01.png
    time stamp or attribute changed: 01.png
    file added: 02.png
    time stamp or attribute changed: 02.png
    time stamp or attribute changed: 02.png
    time stamp or attribute changed: 02.png
    file added: 03.png
    time stamp or attribute changed: 03.png
    time stamp or attribute changed: 03.png
    time stamp or attribute changed: 03.png
    file added: 04.png
    file added: 05.png
    time stamp or attribute changed: 05.png
    time stamp or attribute changed: 05.png
    time stamp or attribute changed: 05.png
    file added: 06.png
    time stamp or attribute changed: 06.png
    time stamp or attribute changed: 06.png
    time stamp or attribute changed: 06.png
    file added: 07.png
    time stamp or attribute changed: 07.png
    time stamp or attribute changed: 07.png
    time stamp or attribute changed: 07.png
    file added: 08.png
    time stamp or attribute changed: 08.png
    time stamp or attribute changed: 08.png
    time stamp or attribute changed: 08.png
    file added: 09.png
    time stamp or attribute changed: 09.png
    time stamp or attribute changed: 09.png
    time stamp or attribute changed: 09.png
    file added: 10.png
    file added: 11.png
    time stamp or attribute changed: 11.png
    time stamp or attribute changed: 11.png
    time stamp or attribute changed: 11.png
    file added: 12.png
    file added: 13.png
    time stamp or attribute changed: 13.png
    time stamp or attribute changed: 13.png
    time stamp or attribute changed: 13.png
    file added: 14.png
    file added: 15.png
    time stamp or attribute changed: 15.png
    time stamp or attribute changed: 15.png
    time stamp or attribute changed: 15.png
    file deleted: 01.png
    file deleted: 04.png
    file deleted: 05.png
    file deleted: 06.png
    file deleted: 07.png
    file deleted: 08.png
    file deleted: 09.png
    file deleted: 10.png
    file deleted: 11.png
    file deleted: 12.png
    file deleted: 13.png
    file deleted: 14.png
    file deleted: 15.png
    

    Hoffe mir kann jemand helfen...

    Vielen Dank im Voraus

    Lg _freeze_



  • Rufe CreateFile () nur einmal vor Eintritt in die äussere for-Schleife auf. Ebenso CloseHandle () nur einmal erst nach Verlassen der äusseren for-Schleife.


Anmelden zum Antworten