Dateien in Verzeichnisse und Unterverzeichnisse



  • Hey @all,
    ich habe folgenden Link durchgearbeitet: http://www.c-plusplus.net/forum/viewtopic.php?t=39284, jedoch wenn ich statt . zum Beispiel *.exe eintippe, dann erscheinen nicht alle *.exe-Dateien.
    Wo liegt das Problem?

    Kann mir da jemand weiterhelfen?
    MfG Roman1311



  • Weiß den keiner einen Rat?

    MfG Roman1311



  • Ich Tipp mal drauf das du den Teil hier in folgendes ändern mußt 🙂

    Vorher:

    int result = FindFirst((StartDirectory + "*.*").c_str(), faReadOnly|faHidden|faDirectory, sr );
    

    Nachher:

    int result = FindFirst((StartDirectory + "*.exe").c_str(), faReadOnly|faHidden|faDirectory, sr );
    


  • Ja, auf das bin ich auch schon gekommen 😉
    Deswegen frage ich hier ja, weil dies eben nicht funktioniert

    MfG Roman1311



  • bleib bei "." und frage selbst ab ob es eine *.exe ist:

    ...
        else  // ist normale Datei 
        { 
          pFiledata Item = new tFiledata; 
          Item->Name = sr.Name; 
          Item->Path = StartDirectory; 
          Item->Data = sr; 
          Liste->Add(Item); 
        } 
    ...
    

    in folgendes abändern:

    ...
        else  // ist normale Datei
        {
            if (sr.Name.SubString(sr.Name.Length()-4,4) == ".exe") 
            {
                    pFiledata Item = new tFiledata;
                    Item->Name = sr.Name;
                    Item->Path = StartDirectory;
                    Item->Data = sr;
                    Liste->Add(Item);
            }
        } 
    ...
    

    Oder, probier mal "*.EXE", ist so ne Idee, da DOS es auch Groß darstellt,
    kann es selbst im Moment nicht Testen.

    gruß Micha



  • Roman1311 schrieb:

    dann erscheinen nicht alle *.exe-Dateien.

    Sondern?

    Bitte immer möglichst genaue Fehler- bzw. Broblembeschreibungen liefern.
    "Funktioniert nicht" reicht nicht aus.



  • Jansen schrieb:

    Roman1311 schrieb:

    dann erscheinen nicht alle *.exe-Dateien.

    Sondern?

    Bitte immer möglichst genaue Fehler- bzw. Broblembeschreibungen liefern.
    "Funktioniert nicht" reicht nicht aus.

    Also mit der "Windows-Suche" bekomme ich 234 .exe-Dateien gefunden in mehreren Unterverzeichnissen, wenn ich jedoch bei dem Problem-Programm statt "." nun ".exe" versuche bekomme ich 27 *.exe-Dateien.
    Also 234-27 ergibt das ich 207 Dateien nicht finde. Nur wieso?

    MfG Roman1311


  • Mod

    Hallo

    liegt es moeglicherweise daran, das du ab irgeneinem Unterverzeichnis suchst
    und nicht aus der Root?

    schau mal welche nicht gefunden werden (wo die sind)

    MfG
    Klaus



  • Vielleicht liegts ja an den Attributen 🙄
    Erstell mal nen neuen Ordner, kopier da ein ppar *.exe Files rein und schau, was von denen angezeigt wird. Vergleich ggf. die Attribute, achte vor allem auf das Archive Flag, evtl. liegt da der Hund begraben.



  • @Peter, ja, ich werde das mal testen, falls es dann noch immer nicht funktioniert werde ich mich nochmals melden, ansonsten vielen Dank im Voraus

    MfG Roman1311



  • Liegen die 27 Dateien alle im Startverzeichnis, geht die Routine also überhaupt in die Unterverzeichnisse?
    Wahrscheinlich nicht, es sei denn, du hättest Verzeichnisse namens xyz.exe.

    Darauf hättest mittels Debugger aber eigentlich selbst kommen sollen.
    Nun versuch zumindest mal, zu verstehen, warum das so ist, und warum du, wie von promicha gezeigt, nachträglich filtern musst.



  • Hi Roman 1311,

    Ich denke Du machst Dir den Inhalt Deines SearchRec kaputt durch den rekursiven Aufruf!!! Ich hatte das auch mal.

    Wenn das prog aus Rekursion zurueckkommt, ist der alte SearchRec (in Rufender Routine) nicht mehr gueltig!

    Ich mach das so:

    gefundene Subdirs in Stringliste speichern, Dateien VERARBEITEN.

    NACH Durchsuchen des akt Verz:

    Alle in Stringlist gespeicherten VerzNamen Rekursiv durchsuchen lassen.

    PS: Schau Dir mal sr im Debugger an!

    VOR und Nach einer Rekursion!



  • @DerAltenburger: Kann ich jetzt absolut nicht nachvollziehen. Hab gestern selber grad schnell ein Tool gebraucht um ein paar Files umzubenennen, und es funktioniert einwandfrei mit exakt diesem Algo. Es gibt auch keinen vernünftigen Grund, wieso sr zerstört werden sollte, da es sich ja um ein StackObjekt handelt.

    Das Problem ist, dass er, ändert er die Suchmaske auf *.exe, die Verzeichnisse automatisch ausschliesst. Deshalb sollte er auch mit MatchesMask() später überprüfen, ob die zurückgelierferten Elemente auf die Suchmaske passen oder nicht, bzw. bei einem Verzeichnis die Rekursion aufrufen.

    Das Alles hätte er allerdings auch selber rausfinden können, würde er den Debugger in der IDE mal benutzen.

    -junix



  • junix schrieb:

    Das Alles hätte er allerdings auch selber rausfinden können, würde er den Debugger in der IDE mal benutzen.
    -junix

    Genau!!!

    Das mit dem zerstoerten Inhalt in SearchRec ist mir auch nur im Debugger mal zufaellig aufgefallen, das tritt auch nur sporadisch auf ??? Haengt wahrscheinlich davon ab wie die Daten in der Reihenfolge gefunden werden. Wenn erst alle Dateien gefunden werden klappt es ohne Probleme. Nur wenn FindNext NACH nem Ordner wieder dateien finden muesste, kommen die nicht mehr alle - IN SearchRec steht nicht dasselbe wie VOR dem Rekursiven Aufruf!!! (???) Zumindest bei meinem BCB 4.0 isses so.Seitdem ich die VerzNamen erst Speichere und dann Rekursieren lasse geht's IMMER ohne Fehler. Ist ev. 'ne Macke vom BCB 4?



  • Ich denke, ein Darstellungsfehler der IDE bzw. des Debuggers... Es macht ja auch keinen Sinn. Wieso sollte das Stackobjekt zerstört werden?

    -junix



  • junix schrieb:

    Ich denke, ein Darstellungsfehler der IDE bzw. des Debuggers... Es macht ja auch keinen Sinn. Wieso sollte das Stackobjekt zerstört werden?

    -junix

    Neeeeee, ein Darstellungsfehler ist das bei mir nicht! Die Daten sind gestoert, die folgenden FindNext() (nach Rekursion) liefern nix brauchbares mehr. Ohne Rekursion kommen alle dateien!

    Ich denke FindFirst, FindNext ... nutzen systemnahe Funktionen - ev immer den gleichen Speicherbereich. 🕶 Wieso geht's IMMER EXAKT, wenn erst nach auswerten aller im Ordner gefundenen Namen alle Unterverz rekursiv durchsucht werden? 😮 Seit ich das so mache, hat's keine Probleme mehr!? 🙂



  • Hi,
    ich habe diese Erscheinung auch schon in denderen Zusammenhängen beobachtet! Selbst bei einfachen rekursiven Funktionen wurden machmal die internen Variablen verwürfelt! Ich habe immer die Variablen von Aufruf der Rekursion gesichert und nach Aufruf wiederhergestellt! Dann ging es!

    MfG

    Alexander Sulfrian



  • Hi,

    Alexander Sulfrian schrieb:

    ich habe diese Erscheinung auch schon in denderen Zusammenhängen beobachtet! Selbst bei einfachen rekursiven Funktionen wurden machmal die internen Variablen verwürfelt

    ein kleines Code-Beispiel währe interessant. Ich nutze häufig Rekursion und wenn es da irgend welche grundsätzlichen Probleme gäbe, währe das fatal ... (wieso gibt es eigentlich kein Smilie für *Angst Angst Angst*)

    DerAltenburger schrieb:

    Ich denke FindFirst, FindNext ... nutzen systemnahe Funktionen - ev immer den gleichen Speicherbereich

    Kann ich mir nicht vorstellen, zumal gerade diese Funktionen ja regelrecht nach Rekursion schreien. Die VCL-Funktionen deuten dem Namen nach stark auf die Win-API.
    Hier eine API-Version als Alternative. Man sieht sofort die Ähnlichkeiten...

    void SearchFiles(String dir)
    {
    /*
        - durchläuft rekursiv alle Dateien und Verzeichnisse
          von _dir (ohne back slash)
    */
        WIN32_FIND_DATA filedata;
        HANDLE filehandle;
        String subDirName;
    
        filehandle = FindFirstFile((dir + "\\*.*").c_str(), &filedata);
        bool found = (filehandle != INVALID_HANDLE_VALUE);
        while (found == true)
        {
            if ((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
            {
                subDirName = filedata.cFileName;
                if ((subDirName != ".") && (subDirName != ".."))
                {   //Unter-Verzeichnis
                    SearchFiles(dir + "\\" + subDirName);     //<--- Rekursion
                }
            }
            else
            {   //Datei
                String fileName = filedata.cFileName;
            }
            found = FindNextFile(filehandle, &filedata);
        }
        FindClose(filehandle);
    }
    

Log in to reply