lothar_matthäus
Mitglied
Hi Liebe Community,
ich hab ein Problem mit der opendir- oder stat()-Funktion in "C" unter Linux.
Grundsätzlich erst einmal nichts spektakuläres:
Ich möchte die Verzeichnisse ausgeben die in einem
von mir benannten Ordner lokalisiert sind.
Verzeichnis ist folgendermaßen (Sorry leicht unübersichtlich):
-Verz_A/0/
-Verz_A/1/
-Verz_A/2/
-Verz_A/3/
-Verz_A/4/
-Verz_A/5/
-Verz_A/6/
-Verz_A/7/
-Verz_A/8/
-Verz_A/9/
-Verz_B/0
-Verz_B/1
-Verz_B/...
-....
-...
-..
Jetzt befinde ich mich in der Ebene von Verz_A und Verz_B also ist dieses Verzeichnis mein working directory "." .
Nun geb ich bei opendif("./Verz_A/")) und erwarte: 0/ bis 9/ als Verzeichnis in der Ausgabe.
Es kommen aber nur nach "." und ".." alle Dateien und Ordner die in dem "Verz_A" Ordner sind.
D.h. es fehlen Ordner und die Unterscheidung zwischen Ordner und Datei wird nicht vorgenommen... .
WENN ICH ABER nur im working directory "." bleibe funktioniert alles.
DARAUS folgt für mich ...
ich muss einen Fehler bei dem Aufruf der stat-Funktion gemacht haben da in der print Ausgabe zuvor alles ausgegeben wird.
Hat jemand eine Idee wir ich jedes beliebige Verzeichnis auslesen kann ohne in das executable in den jeweiligen Ordner zu haben?
(möglichst mit dieser Methode)
Gruß
LM
ich hab ein Problem mit der opendir- oder stat()-Funktion in "C" unter Linux.
Grundsätzlich erst einmal nichts spektakuläres:
Ich möchte die Verzeichnisse ausgeben die in einem
von mir benannten Ordner lokalisiert sind.
Code:
/* read_dir.c */
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
DIR *dir
struct dirent *dirzeiger;
struct stat attribut;
/* Verzeichnis öffnen */
if((dir=opendir(argv[1])) == NULL) {
if((dir=opendir("./N20_L0p55/")) == NULL)
fprintf(stderr,"Fehler bei opendir ...\n");
return EXIT_FAILURE;
}
/* Komplettes Verzeichnis auslesen */
while((dirzeiger=readdir(dir)) != NULL){
printf("\t dirzeiger: %s\n",(*dirzeiger).d_name); //liefert problemlos alle Einträge
stat( (*dirzeiger).d_name , &attribut );
/*Auslassen der . und .. Verzeichniseinträge*/
if(strcmp(".",(*dirzeiger).d_name) == 0 ||strcmp("..",(*dirzeiger).d_name) == 0){
continue;
}
// if( (attribut.st_mode) & S_IFDIR){ //als alternative probiert
if(S_ISDIR(attribut.st_mode)){
// if( (attribut.st_mode & S_IFMT) == S_IFDIR ){ //als alternative probiert
printf("%s\n",(*dirzeiger).d_name);
}
}
/* Lesezeiger schließen */
if(closedir(dir) == -1)
printf("Fehler beim Schließen von %s\n", argv[1]);
return EXIT_SUCCESS;
}
Verzeichnis ist folgendermaßen (Sorry leicht unübersichtlich):
-Verz_A/0/
-Verz_A/1/
-Verz_A/2/
-Verz_A/3/
-Verz_A/4/
-Verz_A/5/
-Verz_A/6/
-Verz_A/7/
-Verz_A/8/
-Verz_A/9/
-Verz_B/0
-Verz_B/1
-Verz_B/...
-....
-...
-..
Jetzt befinde ich mich in der Ebene von Verz_A und Verz_B also ist dieses Verzeichnis mein working directory "." .
Nun geb ich bei opendif("./Verz_A/")) und erwarte: 0/ bis 9/ als Verzeichnis in der Ausgabe.
Es kommen aber nur nach "." und ".." alle Dateien und Ordner die in dem "Verz_A" Ordner sind.
D.h. es fehlen Ordner und die Unterscheidung zwischen Ordner und Datei wird nicht vorgenommen... .
WENN ICH ABER nur im working directory "." bleibe funktioniert alles.
DARAUS folgt für mich ...
ich muss einen Fehler bei dem Aufruf der stat-Funktion gemacht haben da in der print Ausgabe zuvor alles ausgegeben wird.
Hat jemand eine Idee wir ich jedes beliebige Verzeichnis auslesen kann ohne in das executable in den jeweiligen Ordner zu haben?
(möglichst mit dieser Methode)
Gruß
LM