FindFirstChangeNotification



  • Hallo

    Hat jemand ein simpeles beispiel zu FindFirstChangeNotification
    Ich will einfach ein verzeichnis überwachen! Sobald sich was in diesem Verzeichnis getan hat(neue Datei z.B.) soll eine Messagebox erscheinen!
    Habe bereits versucht mit hilfe der MSDN was zu machen aber leider ohne erfolg!

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/obtaining_directory_change_notifications.asp

    Anhand dieser URL habe ich es versucht! Aber irgendwie ......
    Alles blöd! 😡

    Ich hoffe einer hat ein besser verständliches Beispiel als MS!
    thx Sven



  • Servus,

    ich habe mir jetzt mal die Mühe gemacht und dir eine Funktion geschrieben (Wollte es selber auch wissen *g*). Also du solltest hier ReadDirectoryChangeW() benutzen. Dort gibst du dann deine Flags an. Die Funktion kehrt erst zurück wenn sich etwas verändert hat. Deshalb solltest du es in einen Thread setzen.

    Bsp.:

    void CChangeDir::ObserveDir(CString strPath)
    {
    	HANDLE hDir = CreateFile(	strPath,                     // pointer to the file name
    								FILE_LIST_DIRECTORY,                // access (read/write) mode
    								FILE_SHARE_READ|FILE_SHARE_DELETE,  // share mode
    								NULL,                               // security descriptor
    								OPEN_EXISTING,                      // how to create
    								FILE_FLAG_BACKUP_SEMANTICS,         // file attributes
    								NULL                                // file with attributes to copy
    								);
    
    	CString	strRead;
    	DWORD dwReturn;
    
    	strRead.GetBufferSetLength(100);
    	BOOL bChange = ReadDirectoryChangesW(hDir,
    							strRead.GetBuffer(),
    							100,
    							TRUE,
    							FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_FILE_NAME,
    							&dwReturn,
    							FALSE,
    							NULL);
    
    	strRead.ReleaseBufferSetLength(100);
    
    	AfxMessageBox(strRead, MB_OK, NULL);
    
    }
    

    Beim strRead musst du mal gucken was du dort zurück bekommst. Hatte keine Lust das jetzt genauer auszutüffteln. Solltest aufjedenfall dir nochmal in der MSDN anschauen, was alles an Parametern zurück gegeben wird. (DAS IST NUR EIN BSP)

    Diese Funktion ObserverDir() packste in eine Klasse vom Typ CWinThread() rein.

    Noch ein kleiner Chrashkurs mit Threads:

    .cpp

    //Thread
    UINT CDeinDlg::ThreadObserve(LPVOID pParam)
    {
    	CChangeDir dir;
    	CChangeDir *pdir = new CChangeDir();
    
    	pdir->ObserveDir("C:\\Test\\");
    
    	return 0;
    }
    //Aufruf
    void CDeinDlg::OnBnClickedButton1()
    {
      AfxBeginThread(ThreadObserve, this);
    }
    

    CChangeDir ist hier meine Klasse vom Typ CWinThread. Natürlich musst du diese vorher includen.

    .h

    public:
      static UINT ThreadObserve(LPVOID pParam);
    

    Wenn du jetzt die Funktion OnBnClickedButton1() ausführst, wird ein Thread erstellt indem er die Funktion zum Überprüfen ausführt.

    Du solltest dir aber auch nochmal in der MSDN unter AfxBeginThread alles zu Threads durchlesen. (Wenn du noch nie mit Threads gearbeitet hast)

    So das ist nur eine Hilfestellung, denn du sollst auch noch ein bisschen basteln 😃

    Viel Spass
    *winke*
    Hellsgore



  • @Hellsgore

    1000 Dank! Ich werd mal schaunen ob ich es verstehe was da abgeht. Und ob ich es so für meine Zwecke nutzen kann! Sorry das ich erst so spät drauf antworte! war ein bischen busy die letzten Tage! Und dann must ich auch noch diesen Post wieder suchen! 😃
    Auf jedenfall find ich es echt super das du dir die muhe gemacht hast!!!

    thx a lot sven



  • Wie bekomme ich denn eine dateiänderung auf dem Netzwerkserver (W2K) mit ???
    Und das möglichst schnell ??



  • HANDLE hFileChanged = FindFirstChangeNotification("c:\\windows",TRUE,FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_SIZE);
    HANDLE hWaitEvents[] = { hFileChanged};
    DWORD dwResult = WaitForMultipleObjects(2, hWaitEvents,FALSE,INFINITE);
    


  • Sicher, das das auch gilt wenn von der Arbeitsstation der Dateistatus auf dem Server überwacht werden soll ?? Also eine über das Netzwerk anzusprechende Datei, die eben nicht unter der direkten Verwaltung des lokalen Windows steht ??


Anmelden zum Antworten