Verzeichnis einlesen DIR - Flag nicht gesetzt



  • Moin,

    ich habe Probleme unter linux 7.3 beim Verzeichnis einlesen mit der Struktur
    dirent. In dirent wird leider nicht das Flag
    Verzeichnis / Datei
    richtig gesetzt und íst stehts '0' ..
    Ich nutze scandir, nicht scandir64 bzw. dirent64.. Liegt es möglicherweise daran ??

    Heute Abend wenn ich @home bin wird der code gepostet, aber vieleicht
    reichen die Infos ja schon aus.. Habe auch mal was von ein fix für die
    scandir.c gehört, weiß aber nicht direkt wo,wie und was ..

    rgs



  • also es geht um namelist->d_type .. ist immer '0' , bei Verzeichnissen und bei Dateien obwohl dieses Flag darüber Auskunft geben solte ..

    int
    main(int argc, char **argv)
    {
        struct dirent **namelist;
        int i, n;
    
        n = scandir("/etc", &namelist, NULL, alphasort);
    
        for (i = 0; i < n; i++)
            printf("%s\n", namelist[i]->d_type);
    }
    

    hm.. help



  • Original erstellt von hardcoreProgramierer:
    **```cpp
    printf("%s\n", namelist[i]->d_type);

    Schlag' mal den Typen von d_type nach. Kann mir nicht vorstellen, dass das ein char* ist ...

    PS: Warnungen einschalten und beachten.



  • hm.. kann schon sein .. habe hier den code nicht da und einfach einirgendein
    code von d_name nach d_type geändert.. wird dann wohl ein int sein,
    aber der ist an sich immer 0 ..



  • ich wer mal den originalcode mit gcc aufruf heute abend von zu hause posten

    mfg



  • According to POSIX, the dirent structure contains a field
    char d_name[] of unspecified size, with at most NAME_MAX
    characters preceding the terminating null character. Use
    of other fields will harm the portability of your pro­
    grams.

    Aus der readdir man-Page... Könnte sein, daß das auf Deinem
    System nicht unterstützt wird.



  • Original erstellt von hardcoreProgramierer:
    linux 7.3

    [zynismus]Wow, woher bekomme ich denn Linux 7.3? Auf http://kernel.org gibts das leider noch nicht - ist es denn schon stable?[/zynismus]



  • Zyniker ...

    ich habe suse 7.3 installiert und finde bei mir immernoch folgenden bug
    von '97 vor .. es ist auch irgendwie plöd dass die scandir.c bei mir leider
    nicht auffindbar ist, obwohl ich suse komplett installiert habe.. kein plan..

    um das problem und den bekannten fix mal offiziell zu posten :
    http://mail-index.netbsd.org/netbsd-bugs/1997/07/23/0000.html

    .. wie gesagt die scandir.c find ich bei mir nicht .. ist die bei euch da
    für den fix bzw. wäre der fix nötig ???

    hat jemand Erfahrung mit d_type mit scandir() ?? muss ich da wirklich
    zu readdir() wechseln ?

    Den kompletten Code schaff ich leider nicht heute zu posten weil ich schon
    wieder los muss .. machs aber sicher morgen..

    rgs .. by



  • Hi,

    zu scandir () kann ich leider im Moment nichts sagen (is mir zu spaet, jetzt
    nachzulesen ;)), aber falls du readdir () nutzen willst, dann schau doch
    mal in die FAQ.

    mfg
    v R



  • [code]nman: ~ > man scandir
    SCANDIR(3) Linux Programmer's Manual SCANDIR(3)

    NAME
    scandir, alphasort, versionsort - scan a directory for
    matching entries

    SYNOPSIS
    #include <dirent.h>
    [snip: Rest der Manpage][/code]

    Sicher dass es eine scandir.c gibt? Auf meinem System nämlich ganz sicher nicht...



  • Original erstellt von hardcoreProgramierer:
    **ich habe suse 7.3 installiert und finde bei mir immernoch folgenden bug
    von '97 vor .. es ist auch irgendwie plöd dass die scandir.c bei mir leider
    nicht auffindbar ist, obwohl ich suse komplett installiert habe.. kein plan..

    um das problem und den bekannten fix mal offiziell zu posten :
    http://mail-index.netbsd.org/netbsd-bugs/1997/07/23/0000.html
    **

    Sind Bugfixes für NetBSD auch für SuSE-Linux geeignet?

    hat jemand Erfahrung mit d_type mit scandir() ?? muss ich da wirklich
    zu readdir() wechseln ?

    scandir will man idR sowieso nicht verwenden, weil sie nicht portabel (POSIX, Susv*), sondern BSD-Kram, ist.



  • so ich hab jetzt mein Kram auf readdir() umgestellt und finde zu der Funktion auch kein Eintrag in der FAQ, auch nichts zu d_type ..

    mein code :

    #include <dirent.h>
    #include <stdio.h>
    
    #include "display.hpp"
    #include "asyncXAplayer.hpp"
    #include "vgamouse.h"
    
     int main(void)
     {
    
    /*
       serialDisplay   myDisplay("/dev/ttyS2",9600);
                       myDisplay.reset();
                       myDisplay.hideCursor();
                       myDisplay << "egoform BoardComp 1.0";
    
       asyncXAplayer   player;
                       player.init();
    
    */
    
                  DIR  *directory;
        struct dirent  *direntry;
    
                           directory = opendir(".");
             direntry  = readdir(directory);
       while(direntry != NULL)
       {
    
               cout << direntry->d_name << " Type:" << direntry->d_type << "TypeEnd \n";
    //       myDisplay << direntry->d_name << " t:" << direntry->d_type << '\n';
    //       myDisplay.carriageReturn();
        direntry = readdir(directory);     
       }
    
       closedir( directory );
    
        return 0;
     }
    

    ergibt folgende Ausgabe:

    linux:/home/andgei/BACKUP/BoardComp # ./BoardComp
    . Type:TypeEnd
    .. Type:TypeEnd
    Backup Type:TypeEnd
    vgamouse.h Type:TypeEnd
    Makefile Type:TypeEnd
    display.hpp Type:TypeEnd
    BoardComp.o Type:TypeEnd
    BoardComp.cpp Type:TypeEnd
    BoardComp Type:TypeEnd
    Makefile~ Type:TypeEnd
    asyncXAplayer.hpp Type:TypeEnd
    linux:/home/andgei/BACKUP/BoardComp #

    dirent->d_type ist auch bei readdir() uninitialisiert, äquivalent zu scandir()

    irgendwie muss man doch an die Info kommen ob gerade ein Verzeichnis oder eine Datei gefunden wurde ..

    hm 😕



  • das ist irgend wie komisch.

    stat(2) kann dir hier aber helfen (ist aber leider langsammer und umständlicher 😞 )

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <stdio.h>
    
    int main(void)
    {
      DIR *dir=opendir(".");
      if(dir==NULL)
        return 1;
      struct dirent *inode;
      while( (inode=readdir(dir)) !=NULL)
      {
        struct stat st;
        if(lstat(inode->d_name,&st)==-1)
        {
          perror("lstat");
          return 1;
        }
        printf("%s - %c\n",inode->d_name,S_ISDIR(st.st_mode)?'d':'f');
      }
      return 0;
    }
    


  • Original erstellt von kingruedi:
    das ist irgend wie komisch.

    Nicht wirklich. d_type ist eine systemspezifische Erweiterung, sprich es kann ziemlich alles sein. Auch nicht vorhanden oder 'leer'.

    Was die Linux-Standards genau über d_type aussagen, weiß ich nicht. Hier auf FreeBSD tut d_type auf jeden Fall genau das, was dokumentiert wurde (»man 5 dir«).



  • ich frag mich, warum in der Manpage keine entsprechenden Informationen dazu stehen, bei mir

    [ Dieser Beitrag wurde am 16.02.2003 um 18:09 Uhr von kingruedi editiert. ]



  • Besten Dank kingruedi und alle beteiligten! der code mit S_ISDIR() läuft gut und ist bei meiner Anwendung auch praktikabel .. soll ja nur einmal am Anfang eingelesen werden .. interessant wäre nur ob zu d_type was bei linux spezifiziert wurde

    rgs mfg


Anmelden zum Antworten