ReadDirectoryChangesW



  • Hallo,

    ich brauche dringend hilfe bei der Funktion ReadDirectoryChangesW

    Folgende Situation:

    - ich will ein Verzeichnis ständig auf neue Dateien überwachen
    - wenn eine neue Datei gefunden wurde, brauche ich den Dateinamen der neuen
    Datei

    Das ganze soll auch noch in einem Thread ablaufen. Mein Code bisher:

    void __fastcall DirectoryWatch::Execute()
    {
       HANDLE hDir;
       FILE_NOTIFY_INFORMATION fInfo;
       LPVOID lpBuffer = &fInfo;
       LPDWORD bytesReturned;
    
       hDir = CreateFile (
          "D:\\Kremer",
          GENERIC_READ,
          FILE_LIST_DIRECTORY,
          NULL,
          OPEN_EXISTING,
          FILE_FLAG_BACKUP_SEMANTICS,
          NULL);
    
       if (ReadDirectoryChangesW(hDir, lpBuffer, sizeof(lpBuffer), FALSE, FILE_NOTIFY_CHANGE_FILE_NAME, bytesReturned, NULL, NULL))
       {
            MessageDlg("test", mtInformation, TMsgDlgButtons() << mbOK, 0);
       }
    
    }
    

    Problem im Moment ist das die Funktion nicht zurückkommt, d.h. der Thread bleibt an der Stelle wo die Funktion aufgerufen wird stehen, auch wenn neue Dateien hinzukommen!
    Mache ich grundsätzlich etwas falsch?

    Vielen Dank schon mal für Eure Hilfe



  • Versuch es mal so (im Umgang mit Pointern scheinst du nicht ganz vertraut zu sein 😉 ):

    HANDLE hDir;
    FILE_NOTIFY_INFORMATION fInfo;
    DWORD bytesReturned;
    
    hDir = CreateFile (
          "D:\\Kremer",
          FILE_LIST_DIRECTORY,
          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
          NULL,
          OPEN_EXISTING,
          FILE_FLAG_BACKUP_SEMANTICS,
          NULL);
    
    if (ReadDirectoryChangesW(hDir, &fInfo, sizeof(fInfo), FALSE, FILE_NOTIFY_CHANGE_FILE_NAME, &bytesReturned, NULL, NULL))
    {
        MessageDlg("test", mtInformation, TMsgDlgButtons() << mbOK, 0);
    }
    

    Ist allerdings nicht getestet - Fehler sind also nicht ausgeschlossen 🕶

    Ansonsten: Spying a file system - Files and Folders 🙂



  • Danke, die Funktion klappt jetzt zumindest schon mal so halb!
    Sie erkennt wenn eine Änderung in dem Verzeichnis ist!

    Ich habe aber noch Probs an den Dateinamen zu kommen! In der fInfo Struktur stehen keine Infomationen drin 😞



  • Ich habe mir gerade mal die FILE_NOTIFY_INFORMATION-Struktur angeschaut und bemerkt, dass dort nur WCHAR FileName[1]; bereits enthalten ist - du musst also einen größeren Speicher reservieren und dann nachher entsprechend casten.

    HANDLE hDir = CreateFile(
          "D:\\Kremer", 
          FILE_LIST_DIRECTORY, 
          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 
          NULL, 
          OPEN_EXISTING, 
          FILE_FLAG_BACKUP_SEMANTICS, 
          NULL); 
    
    DWORD bufSize = sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH*sizeof(WCHAR);
    char *fInfo = new char[bufSize];
    ZeroMemory(fInfo,bufSize);
    DWORD bytesReturned; 
    
    if (ReadDirectoryChangesW(hDir, fInfo, bufSize, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME, &bytesReturned, NULL, NULL))
    {
        MessageDlg("test", mtInformation, TMsgDlgButtons() << mbOK, 0);
        MessageBoxW(NULL,((FILE_NOTIFY_INFORMATION *)fInfo)->FileName,L"",0);
    }
    

    Ich bin mir nicht ganz sicher, ob das so funktioniert - einfach mal testen und berichten 😉

    edit: Habe es jetzt doch getestet, und damit keine Verwirrung entsteht nochmal den ganzen Code gepostet. 🙂



  • Hallo,

    vielen Dank für Deine Hilfe!

    Ja, mit Zeigern hab ich es nicht so. Habe bis vor kurzem nur Java programmiert, und muss mich jetzt in C++ einarbeiten!

    Auf jeden Fall läuft es jetzt!

    Thx


Anmelden zum Antworten