[ERLEDIGT!] Alle Ordnernamen in Verzeichnis ausgeben



  • Borland bietet mit der VCL die Funktionen FindFirst/FindNext/FindClose, zusammen mit der Klasse TSearchRec kann man alle Einträge eines Verzeichnisses durchlaufen und deren Attribute auswerten.



  • rage_qu1t schrieb:

    "find" sollte das auch können 🙄

    Eher "ls" :p



  • WOW so schnelle Antworten 😉

    rage_qu1t schrieb:

    pack das doch erstmal in eine eigene rekursive funktion... entweder versuchst es zu öffnen gehts ists ein ordner. andernfalls nimmst os-functionen 😉

    meinst ich mach dann opendir("/<PATHTOFOLDER>") auf alle gefundenen Elemente? Das hab ich grad so probiert

    if(!opendir(dir->d_name)) continue;
    

    aber hat nicht so funktioniert. Ausgabe ist dann nur . .. Oder meinst Du anders??

    fr33g schrieb:

    Also mit Linux kenn ich mich leider gar nicht aus, aber unter Windows oder auch Qt gibt es extra Parameter bzw Konstanten die man angeben kann, damit einem nur Ordner angezeigt werden.

    Weißt Du wie das unter WIN und Qt bei Dir funktioniert? Vielleicht kann ich dazu ja äquivalentes finden was auch hier funktioniert... 🙂

    rage_qu1t schrieb:

    "find" sollte das auch können

    Hast Du dazu vielleicht ein kleines Mini-Beispiel für mich? Wär super 😉

    DocShoe schrieb:

    Borland bietet mit der VCL die Funktionen FindFirst/FindNext/FindClose, zusammen mit der Klasse TSearchRec kann man alle Einträge eines Verzeichnisses durchlaufen und deren Attribute auswerten.

    Dazu vielleicht auch ein Beispielprogrämmchen zur Hand oder eine Webseite wo ich mal schauen kann? Sitze gerade ehrlich gesagt zum ersten mal an Borland...

    Danke 🙂



  • Aus der Hüfte geschossen:

    TSearchRec FileRecord;
    
    if( FindFirst( PathName, faAnyFile, FileRecord ) == 0 )
    {
       do
       {
          if( FileRecord.Attr & faDirectory )
          {
             // Verzeichnis
          }
          else
          {
             // kein Verzeichnis
          }
       }
       while( FindNext( FileRecord ) == 0 );
    
       FindClose( FileRecord );
    }
    

    Mit F1 solltest du in das BCB Hilfesystem gelangen



  • DocShoe schrieb:

    Aus der Hüfte geschossen:

    TSearchRec FileRecord;
    
    if( FindFirst( PathName, faAnyFile, FileRecord ) == 0 )
    {
       do
       {
          if( FileRecord.Attr & faDirectory )
          {
             // Verzeichnis
          }
          else
          {
             // kein Verzeichnis
          }
       }
       while( FindNext( FileRecord ) == 0 );
     
       FindClose( FileRecord );
    }
    

    Daraus werd ich jetzt ehrlich gesagt nicht ganz schlau...
    Hab das aber auch mal so abgetippt und probiert. Bei If und else mit printf was ausgeben... irgendwie wird das printf erst ausgeführt wenn das Programm beendet wird... ganz komisch!

    Also PathName da ist klar, aber was ist das faAnyFile?
    Bei der if-Abfrage muss ich nichts mehr ändern, oder?
    In FileRecord steht dann der gefundene Dateiname, richtig?
    Wenn ich das dann in ein StringArray reinschieben will dann würde ich das so machen Array[index] = FileRecord; index++; was aber leider auch nicht so gewollt hat wie ich wollte... 😞

    Mit F1 solltest du in das BCB Hilfesystem gelangen

    F1 hat hier leider gar keine Funktion... die IDE ist Kylix falls Du das noch kennst.... ganz ekelhaft sag ich Dir 😡



  • Also mit der Win-API sah das so ungefähr aus:

    HANDLE fileHandle;
    WIN32_FIND_DATA winFindData;
    
    // Die ersten beiden Ergebnisse raussuchen, da diese nicht von Bedeutung sind( /.  und /..  )
    fHandle=FindFirstFile( "c:\\programme\\*",&winFindData ); 
    FindNextFile( fileHandle,&winFindData ); 
    
    // Jetzt die eigentliche Suche
    while( FindNextFile( fileHandle,&winFindData ) ) 
    { 
        if( winFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
        { 
           // Ist ein Verzeichnis, man könnte jetzt auch noch rekursiv 
           // Unterverzeichnisse raussuchen.
           // Mit winFindDta.cFileName bekommst den Ordnernamen raus
        } 
        else 
        { 
           // Es ist eine Datei mit winFindData.cFileName bekommt man den Namen
        } 
    } 
    FindClose( fileHandle );
    

    Lg freeG



  • Bist du mal auf die Idee gekommen, nach den Suchbegriffen "FindFirst" "FindNext" "faAnyFile" und "Kylix" oder "Borland" zu googlen? Bei so wenig Initiative tut´s mir fast schon wieder leid, überhaupt geantwortet zu haben.



  • DocShoe schrieb:

    Bist du mal auf die Idee gekommen, nach den Suchbegriffen "FindFirst" "FindNext" "faAnyFile" und "Kylix" oder "Borland" zu googlen? Bei so wenig Initiative tut´s mir fast schon wieder leid, überhaupt geantwortet zu haben.

    Dieser Vorwurf ist wirklich unverschämt! Dass ich selber Eigenitiative zeige und habe mein Problem zu lösen sieht man zum einen an meinem geposteten Lösungsansatz. Und JA gegoogelt hab ich auch genau diese Begriffe. Allerdings kommt da lauter Delphi und Pascal Zeugs.... faAnyFile ist mir auch klar, dass es sozusagen "alle gefundenen Dateien" bedeutet.... aber TSearchRec und die Suche war mir eben noch ganz neu... daher die Frage ob Du, da Du das ja so gut kennst, auch richtig erklären könntest/würdest. Oder irgendjemand anderes der sich dafür nicht zu schade ist......!
    Dazu hab ich folgendes gefunden:
    http://www.delphibasics.co.uk/RTL.asp?Name=TSearchRec
    http://www.programmersheaven.com/mb/bcbuilder/324308/324308/scan-folder/
    Noch immer ist da ein mittelgroßes Fragezeichen.

    Das Problem hab ich inzwischen anderweitig lösen können, wobei die jetzige Lösung nicht besonders "schön" ist und auch viel mehr Code hat.... daher besteht auf jeden Fall noch nach wie vor Interesse eine schöne Lösung für dieses Problem zu finden....

    Viele Grüße



  • find . -maxdepth 1 -type d
    

    sollte da doch echt am einfachsten sein.
    Du kannst das ganze ja in eine Datei pipen und dann die Datei lesen. Dann hast du nicht son Problem wie hier.



  • Maxi schrieb:

    find . -maxdepth 1 -type d
    

    sollte da doch echt am einfachsten sein.
    Du kannst das ganze ja in eine Datei pipen und dann die Datei lesen. Dann hast du nicht son Problem wie hier.

    möglicherweise auch direkt in das verarbeitende programm pipen 😋



  • rage_qu1t schrieb:

    Maxi schrieb:

    find . -maxdepth 1 -type d
    

    sollte da doch echt am einfachsten sein.
    Du kannst das ganze ja in eine Datei pipen und dann die Datei lesen. Dann hast du nicht son Problem wie hier.

    möglicherweise auch direkt in das verarbeitende programm pipen 😋

    hmmm das ist eigentlich gar nicht mal so ne üble Idee 👍 da kam ich auch noch nicht drauf.... allerdings in eine Datei pipen tut jetzt zu meiner Lösung auch keinen großen Unterschied in Code-Size weil ich da dann die Datei öffnen, lesen, und so alles noch hab....
    aber direkt ins Programm..... geht das denn überhaupt?? Hab ich so jetzt noch nie gesehen/gehört....

    aber eine direkte schöne Lösung im Programm selbst wäre schon trotzdem das Optimale....



  • Mufasa schrieb:

    DocShoe schrieb:

    Bist du mal auf die Idee gekommen, nach den Suchbegriffen "FindFirst" "FindNext" "faAnyFile" und "Kylix" oder "Borland" zu googlen? Bei so wenig Initiative tut´s mir fast schon wieder leid, überhaupt geantwortet zu haben.

    Dieser Vorwurf ist wirklich unverschämt! Dass ich selber Eigenitiative zeige und habe mein Problem zu lösen sieht man zum einen an meinem geposteten Lösungsansatz. Und JA gegoogelt hab ich auch genau diese Begriffe. Allerdings kommt da lauter Delphi und Pascal Zeugs.... faAnyFile ist mir auch klar, dass es sozusagen "alle gefundenen Dateien" bedeutet.... aber TSearchRec und die Suche war mir eben noch ganz neu... daher die Frage ob Du, da Du das ja so gut kennst, auch richtig erklären könntest/würdest. Oder irgendjemand anderes der sich dafür nicht zu schade ist......!
    Dazu hab ich folgendes gefunden:
    http://www.delphibasics.co.uk/RTL.asp?Name=TSearchRec
    http://www.programmersheaven.com/mb/bcbuilder/324308/324308/scan-folder/
    Noch immer ist da ein mittelgroßes Fragezeichen.

    Das Problem hab ich inzwischen anderweitig lösen können, wobei die jetzige Lösung nicht besonders "schön" ist und auch viel mehr Code hat.... daher besteht auf jeden Fall noch nach wie vor Interesse eine schöne Lösung für dieses Problem zu finden....

    Viele Grüße

    In letzter Zeit tauchen hier im Forum wirklich allertrivialste Fragen auf, bei denen der Threadersteller wenig/bis keine Eigeninitiative zeigt und alles vorgekaut serviert bekommen möchte. Wenn man nach TSearchRec googelt bekommt man schon beim zweiten Treffer eine Aufschlüsselung der TSearchRec Eigenschaften (und sogar deren Eigenheiten und Unix/Linux), daher finde ich die Frage, was ein TSearchRec und seine Eigenschaften denn eigentlich sind unverschämt. Wenn ich mich hinsetzen kann und mir die Zeit nehme ein Codebeispiel zu posten, dann solltest du dir auch die Zeit nehmen, das durchzuarbeiten und eigene Recherchen bei Unklarheiten anzustellen.
    Gerade bei unbekannten APIs gehört eine gewisse Einarbeitungszeit dazu, und es kann auch nicht schaden, ein kleines Testprogramm zu schreiben, um sich unklare Details anzugucken.
    Mir ist meine Zeit nicht zu schade, anderen Leuten zu helfen, nur irgendwann ist Schluss mit der Hilfsbereitschaft.



  • Mufasa schrieb:

    Hallo allerseits,

    ich muss für ein Programm alle Unterverzeichnisse in einem Ordner ausgeben. Das ganze läuft unter Linux (ganz altes Knoppix) und Compiler ist Borland. (Ich weiß was Ihr jetzt denkt.... ist leider nicht zu ändern... 😞 )

    Also mein Programm bisher gibt mir alles in dem Ordner aus. Also Verzeichnisse aber auch normale Dateien.

    #include <dirent.h> 
    #include <stdio.h> 
    
    int main(void)
    {
      DIR           *d;
      struct dirent *dir;
      d = opendir("/<PATHTOFOLDER>");
      if (d)
      {
        while ((dir = readdir(d)) != NULL)
        {
          printf("%s\n", dir->d_name);
        }
    
        closedir(d);
      }
    
      return(0);
    }
    

    Problem ist, dass die Ordner keine besonderen Merkmale haben, dass ich das damit selektieren könnte. Und manche Dateien haben auch keinen Punkt bzw. Endung... also nach "." suchen geht auch nicht...

    Gibt es einen Weg speziell nur die Ordner auszugeben? Oder irgendein anderer Vorschlag?
    Auch wenn Ihr sowas vielleicht schon mal auf anderen Systemen gemacht habt... würde mich über Info sehr freuen. Vielleicht kann man das ja für Linux/Borland dann anpassen...

    Danke schon mal im Voraus 🤡

    So sollte es ohne VCL funktionieren...

    #include <dirent.h> 
    #include <stdio.h> 
    
    int main(void)
    {
      DIR           *d;
      struct dirent *dir;
      d = opendir("/<PATHTOFOLDER>");
      if (d)
      {
        while ((dir = readdir(d)) != NULL)
        {
          switch(dir->d_type) 
          {
          case DT_DIR:
            printf("%s\n", dir->d_name);
            break;
          default:
            break;
          }
        }
    
        closedir(d);
      }
    
      return(0);
    }
    

    Siehe dazu auch hier

    Greets



  • Mufasa schrieb:

    Maxi schrieb:

    find . -maxdepth 1 -type d
    

    sollte da doch echt am einfachsten sein.
    Du kannst das ganze ja in eine Datei pipen und dann die Datei lesen. Dann hast du nicht son Problem wie hier.

    hmmm das ist eigentlich gar nicht mal so ne üble Idee 👍 da kam ich auch noch nicht drauf.... allerdings in eine Datei pipen tut jetzt zu meiner Lösung auch keinen großen Unterschied in Code-Size weil ich da dann die Datei öffnen, lesen, und so alles noch hab....

    Datei öffnen und einlesen ist ein 3zeiler 🙂

    std::vector<std::string> dirs;
    std::ifstream inf("datei.txt");
    std::string fn;
    while(std::getline(inf, fn))
      dirs.push_back(fn);
    

    Und auf die Lösung von Tobias hätte man auch alleine kommen können 😉



  • Tobias Gerg schrieb:

    So sollte es ohne VCL funktionieren...

    #include <dirent.h> 
    #include <stdio.h> 
    
    int main(void)
    {
      DIR           *d;
      struct dirent *dir;
      d = opendir("/<PATHTOFOLDER>");
      if (d)
      {
        while ((dir = readdir(d)) != NULL)
        {
          switch(dir->d_type) 
          {
          case DT_DIR:
            printf("%s\n", dir->d_name);
            break;
          default:
            break;
          }
        }
    
        closedir(d);
      }
    
      return(0);
    }
    

    Siehe dazu auch hier

    Greets

    YESSS! That's it! Genauuuu so sollte es sein, DANKE SCHÖN 👍👍


Anmelden zum Antworten