Verzeichnis überwachen



  • Hallo,

    ich habe vor ein Verzeichnis so zu überwachen, dass mir in der Konsole jede neu hinzugekommene Datei angezeigt wird (≅ FileSystemWatcher in .NET).
    Ich verwende dafür einen List-Container, dem die Dateinamen hinzugefügt werden, falls diese nicht schon in der List existieren. Das ganze läuft in einer Schleife bis der User eine Taste drückt:

    #include <iostream>
    #include <list>
    #include <algorithm>
    
    #include <conio.h>
    #include <winbase.h>
    
    using namespace std;
    
    void checkDirectory(const char* path);
    bool listIncludes(const char* item);
    
    list<char*> files;
    
    int main()
    {
        //...
    
        while(!kbhit())
        {
            checkDirectory("C:\\...\\*");
        }
    
        return 0;
    }
    
    void checkDirectory(const char* path)
    {
        HANDLE hnd;
        WIN32_FIND_DATA match;
    
        hnd = FindFirstFile(path, &match);
    
        do
        {
            if(!((match.cFileName[0] == '.') && ((match.cFileName[1] == '.' && match.cFileName[2] == 0) || match.cFileName[1] == 0)))
            {
                if (!(match.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
                {
                    if(!listIncludes(match.cFileName))
                    {
                        /*Bildschirmausgabe*/ cout << match.cFileName << endl;
                        /*Loggen*/ files.push_back(match.cFileName);
                    }
                }
            }
        }
        while(FindNextFile(hnd, &match));
    
        FindClose(hnd);
    }
    
    bool listIncludes(const char* item)
    {
        char** found;
        found = find(&(files.front()), &(files.back()), item);
    
        return (found != &(files.back()));
    }
    

    Theoretisch müsste das ja funktionieren, aber das tut es nicht.
    Ich bekomme nur die ersten zwei Dateien des Testverzeichnisses aufgelistet. Dateien, die ich erst nach dem Programmstart ins Testverzeichnis verschiebe, werden auch nicht erkannt.

    Entweder ich habe das Auflisten der Dateien oder das Überprüfen der Liste auf existierende Einträge falsch verstanden.
    Vllt kann mir jemand dabei helfen, thx

    vredezbyrD



  • Du speicherst in der Liste Zeiger auf char. Nachdem du "files.push_back(match.cFileName);" gemacht hast und die Funktion "checkDirectory" verlassen wird, wo glaubst du zeigt der Zeiger in der Liste dann hin? Genau. Ins Nirvana.

    // 1.
    std::list<std::string> files;
    
    // 2.
    bool IsInList(const std::string& str)
    {
        return find(files.begin(), files.end(), str) != files.end();
    }
    

    Das sollte helfen.



  • Omg, ich vergesse immer, dass Zeiger != Arrays sind.
    Jetzt ist mir klar, dass das nicht funktionieren kann..

    Deine Lösung mit strings klappt einwandfrei 👍

    mfg vredezbyrD



  • Warum machst Du alles selber, und verwendet nicht die Windows Funktionen?
    http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx



  • lol, sowas hab ich schon mal gesucht 🙄


Anmelden zum Antworten