Directory überwachen
-
Hi,
ich will in meiner Anwendung ein Directory überwachen, ob ein neues File erstellt wurde oder sich der letzte Zugriff auf ein File geändert hat (also ob was neues reingeschrieben wurde).
Ist da noch irgendwie "einfacher" möglich als mit FirstChangeNotification, da bräuchte ich ja wieder einen Thread ! Und bei ReadDirectoryChangesW muss ich ja warten bis er wieder zurückkehrt !
Bin dankbar für jede Hilfe !

-
Jemand ne Idee ??
-
Hat wirklich keiner ne Idee ??

Komme da nicht weiter !
-
Nein! Du musst nicht warten. Du musst nur Overlapped I/O einsetzen...
Dann kannst Du das ganze auch einfach in einem Thread abhandeln.
-
Ok, dann werde ich das mal overlapped machen !
Danke dir für die Hilfe !
-
Hab damit noch Probleme !
Wenn ich auf den Start-Button klicke, dann starte ich meinen Thread, der dann prüfen soll, ob im genwünschten Directory eine Änderung stattgefunden hat !
Das steht u.a. im Eventhandler des Buttons:AfxBeginThread(ThreadStart, this); if (m_pDoc->StartRecv()) { if(WaitForSingleObject(m_hChangeEvent, 400) != WAIT_TIMEOUT) // prüfen lassen, ob es neuen Eintrag im Error-Logfile gibt { OnBnClickedButtonstop(); AfxMessageBox("Fehler beim Starten des Vorgangs.\r\n\r\nDie Dateien im Errorlog-Ordner enthalten mehr Informationen.", MB_ICONERROR); ResetEvent(m_hChangeEvent); return; } ResetEvent(m_hChangeEvent);Will hier 400ms warten, und dann wissen, ob mein Event signaled ist, m_hChangeEvent ist ein HANDLE (logisch), und wird in OnInitialUpdate per CreateEvent erstellt.
Die Threadfunction:
if (m_pDoc->szErrorPath != "" && m_pDoc->PathOK) { HANDLE hErrorDir = CreateFile(m_pDoc->szErrorPath, FILE_LIST_DIRECTORY, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hErrorDir != INVALID_HANDLE_VALUE) { CString strRead; DWORD dwReturn; BOOL bChange; OVERLAPPED over; over.hEvent = m_hChangeEvent; while (1) { bChange = ReadDirectoryChangesW(hErrorDir, strRead.GetBuffer(), strRead.GetLength(), TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_CREATION, &dwReturn, &over, NULL); if (WaitForSingleObject(over.hEvent, 300) != WAIT_TIMEOUT) { if (GetOverlappedResult(hErrorDir, &over, NULL, FALSE)) SetEvent(m_hChangeEvent); break; } else break; } } CloseMyHandle(hErrorDir); } return;Ich weiß nicht, ob das so überhaupt Sinn ergibt, so wie ich das hier mir zusammengereimt habe.
Ich will eben nur beim Klick auf den Button prüfen, ob ob ein neues File estellt wurde oder in ein existierendes geschrieben wurde. Und das soll nur einmal pro Klick auf den Button geschehen, der Thread soll das prüfen und dann wird er auch gleich wieder beendet.Hab ich vllt hier was übersehen ? Kenn mich mit asynchronen Operationen nicht so aus ! Könnte da Hilfe gebrauchen !
Schonmal Danke fürs Lesen

-
SHChangeNotifyRegister könnte Dir vielleicht auch gefallen.
-
Das klingt gut

Hab das aber jetzt über FindFirstChangeNotification in nem Thread gelöst, hab es nur noch nicht gepostet, werde das aber morgen der Vollständigkeit halber noch tun !

-
Morgen,
also hier noch meine Lösung:
void C...Doc::ThreadCheckErrorlogDir() { if (m_szErrorPath != "") { HANDLE hChange = FindFirstChangeNotification(m_szErrorPath, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE); if (hChange == INVALID_HANDLE_VALUE) return; HANDLE hEvents[2]; hEvents[0] = hChange; hEvents[1] = m_CloseEvent.m_hObject; bool bContinueLoop = true; while (bContinueLoop) { if (WaitForMultipleObjects(2, hEvents, FALSE, INFINITE) - WAIT_OBJECT_0 == 0) { CSingleLock singLock(&m_mut, TRUE); m_bErrorLogChange = true; singLock.Unlock(); FindNextChangeNotification(hChange); } else // Thread beenden (m_CloseEvent ist signaled) bContinueLoop = false; } FindCloseChangeNotification(hChange); } return; }und in OnCloseDocument wird so auf das Threadende gewartet:
if (m_pThread != NULL) { m_CloseEvent.SetEvent(); // auf Threadende warten if (WaitForSingleObject(&m_CloseEvent, 300) == WAIT_TIMEOUT) AfxEndThread(1); }Falls jemand auch so ein Problem hat und auf diesen Thread stößt.

Und nochmal danke an alle für die Unterstützung.