Verzeichnis einlesen DIR - Flag nicht gesetzt
-
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 entriesSYNOPSIS
#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