Verzeichnis einlesen DIR - Flag nicht gesetzt



  • 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