Verzeichnis durchsuchen



  • Hallo,

    ich habe da ein pikantes problem. der ablauf des folgenden codes soll so aussehen:
    - durchsuche das gesamte verzeichnis mit übergebenen pfad und suchwort
    - wenn du auf eine datei / einen ordner stößt die genau dem selben namen hat, gib TRUE zurück
    - wenn du in dem gesamten verzeichnis nichts findest, gib FALSE zurück

    nun hier erstmal der code

    funktionsaufruf

    if(exist("\\*","Save"))
    
    bool exist(AnsiString Path, AnsiString target){
    
            HANDLE fHandle;
            WIN32_FIND_DATA wfd;
    
            fHandle=FindFirstFile(Path.c_str(),&wfd);
            do{
                    FindNextFile(fHandle,&wfd);
                    AnsiString File = wfd.cFileName;
                    if(File == target)
                      return true;
            }while(FindNextFile(fHandle,&wfd));
    
            return false;
    }
    

    das problem ist, die funktion gibt immer nur FALSE zurück. nach meiner fehleranalyse steckt die ursache meiner meinung nach in

    if(File == target) // File = die datei die die funktion gerade hat | target =  das suchwort was übergeben wird
    

    wenn ich die abfrage ändern würde in

    if(File == "abc.exe")
    

    würde er die abc.exe erkennen und TRUE zurückgeben. also wird ja "File" korrekt ausgelesen und "target" wird auch korrekt übergeben, nur die funktion will die 2 variablen nich als gleich erkennen. was kann ich tun?

    mfg



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nimm "strcmp" zum vergleichen...
    Bei Rückgabewert 0 sind die strings identisch!

    Gruß
    Sascha



  • is immernoch das selbe 😞

    bool exist(AnsiString Path, AnsiString target){
    
            HANDLE fHandle;
            WIN32_FIND_DATA wfd;
    
            fHandle=FindFirstFile(Path.c_str(),&wfd);
            do{
                    FindNextFile(fHandle,&wfd);
                    AnsiString File = wfd.cFileName;
                    if(strcmp (File.c_str(),target.c_str()) == 0)
                      return true;
            }while(FindNextFile(fHandle,&wfd));
    
            return false;
    }
    
    if(strcmp (File.c_str(),target.c_str()) == 0)
    

    funktioniert wieder nicht

    if(strcmp ("abc.exe",target.c_str()) == 0)
    

    is wieder true

    ... aber File wird auch korrekt ausgelesen 😕



  • Wieso hast Du eigentlich FindNextFile() innerhalb von do() und nochmal in der while()-Bedingung? So überspringst Du doch Dateien?



  • hab jetzt mitlerweile

    while(FindNextFile(fHandle,&wfd)){ 
                    FindNextFile(fHandle,&wfd); 
                    AnsiString File = wfd.cFileName; 
    
                    if(strcmp (File.c_str(),target.c_str()) == 0) 
                      return true; 
    }
    

    da überspring ich nur noch 3 sachen. einmal ".", ".." und die erste. nur hab ich 14 dateien im ordner und ich finde nur 8.



  • ?! Du überspringst jedesmal beim Betreten der while()-Schleife eine Datei, weil FindNextFile() direkt zweimal hintereinander aufgerufen wird (einmal durch die while-Bedingung und einmal durch den Aufruf in der while-Schleife selbst)



  • while(FindNextFile(fHandle,&wfd)){   // <-- Aufruf FindNextFile()
                    FindNextFile(fHandle,&wfd); // <-- Dieser Aufruf von FindNextFile() ist zuviel und muss weg
                    AnsiString File = wfd.cFileName;
    
                    if(strcmp (File.c_str(),target.c_str()) == 0)
                      return true;
    }
    


  • ok habs jetzt, funktioniert. gott war das ne geburt 😕

    bool exist(AnsiString Path, AnsiString target){
    
            HANDLE fHandle;
            WIN32_FIND_DATA wfd;
    
            fHandle=FindFirstFile(Path.c_str(),&wfd);
    
            while(FindNextFile(fHandle,&wfd)){
                    AnsiString File = wfd.cFileName;
                    if(strcmp(File.c_str(),target.c_str())==0){
                       FindClose(fHandle);
                       return true;
                    }
            }
            FindClose(fHandle);
            return false;
    }
    

    danke euch 🙂



  • Ich würde eher "stricmp" verwenden...



  • Du überspringst immernoch ein File ....

    bool exist(AnsiString Path, AnsiString target){
    
            HANDLE fHandle;
            WIN32_FIND_DATA wfd;
    
            fHandle=FindFirstFile(Path.c_str(),&wfd); //<--- dieses Suchergebniss möchte auch gern beachtet werden :clown:
    
            while(FindNextFile(fHandle,&wfd)){
                    AnsiString File = wfd.cFileName;
                    if(strcmp(File.c_str(),target.c_str())==0){
                       FindClose(fHandle);
                       return true;
                    }
            }
            FindClose(fHandle);
            return false;
    }
    

Anmelden zum Antworten