Dateien/Ordner in Verzeichnis nach und nach Rechte abfragen



  • Hallo zusammen.
    habe ein Problem mit meinem Programm ich habe eine Funktion die bestimmte Verzeichnisse ausliesst die Dateien und Ordner beinhalte. Und dann habe ich noch eine Funktion bei der ich Abfrage welche Rechte die von mit gewählte Datei oder Ordner hat.
    Jetzt will ich diese zweite Funktion (Rechte abfragen) in der ersten integriiiiren, dass beim auslesen des Verzeichniss direkt die Rechte neben der Datei oder Ordner gezeigt wird.
    Ich bekomm nicht hinn wie ich nach und nach die Datei oder rdner als Variable andie andere Funktion weitergeben kann.
    Danke.

    Hier mal mein Code:

    void inhverz(int argc,char*argv[]) /*Funktion inhalt Verzeichnis*/
    {
        DIR *dirHandle;
        int i;
        //char argm4[50];
        struct dirent *dirEntry;
          /*Mit opendir(".")) wird aktuelles Verzeichnis ausgegeben*/
          dirHandle = opendir(argv[4]);
          if (dirHandle)
          {
          while (0 != (dirEntry = readdir(dirHandle)))
             {
    
               for (i = 0 ; i < argc ; i++)
    
                 {
                   printf("%s|",argv[i]);
                 }
                puts(dirEntry->d_name);
    
            }
    
              printf("%s|%s|%s|%s|%s|***EOF_DIR***\n",argv[0],argv[1],argv[2],argv[3],argv[4]);
              closedir(dirHandle);
          }
    }
    

    void zeige_rechte(int argc,char *argv[]) /*Zeige Rechte*/
    {
    struct stat attribut;
    int i;
    char l_rwx[10];
    char rwx[] = "rwxrwxrwx";

    int bits[] = {
    S_IRUSR,S_IWUSR,S_IXUSR, /* Zugriffsrechte User /
    //S_IRGRP,S_IWGRP,S_IXGRP, /
    Zugriffsrechte Gruppe /
    //S_IROTH,S_IWOTH,S_IXOTH /
    Zugriffsrechte der Rest */
    };

    while(*++argv) {

    l_rwx[0]='\0';

    // mua|...
    printf("mua|%s|%s|%s|%s|",argv[0],argv[1],argv[2],argv[3]);

    if(stat(argv[3],&attribut) < 0)
    {
    fprintf(stderr, "Fehler bei stat ...\n");
    return ;
    }

    // Verzeichnis ?
    // der - oder d vor rwxrwxrwx
    if(attribut.st_mode & S_IFDIR)
    printf("d");
    else
    printf("-");
    // rwxrwxrwx
    for(i = 0; i < 9; i++)
    {
    /* wenn nicht 0, dann gesetzt */
    if(attribut.st_mode & bits[i])
    l_rwx[i]=rwx[i]; /*r,w oder x*/
    else
    l_rwx[i] = '-'; /*wenn nicht gesetzt, dann '-'*/
    }
    l_rwx[9]='\0';
    printf("%s",l_rwx);

    // Eigentümer
    printf("|USER:%d", attribut.st_uid);
    // Gruppe
    printf("|GROUP:%d", attribut.st_gid);
    // Grosse
    printf("|SIZE:%ld", attribut.st_size);
    // letzte änderung
    printf("|LAST:%s\n", ctime(&attribut.st_mtime));
    return ;
    }



  • Editier bitte nochmal dein Posting und setze deine beiden Funktione in cpp-Tags (nicht code), damit man die auch lesen kann.
    (Das Forum funktioniert jetzt wieder.)

    Nimm am besten einen Debugger und geh die Funktionen schrittweise durch, damit du verstehst was da passiert.
    Dann musst du dir auch noch die man-Pages zu der Funktion stat(2) durchlesen.



  • [cpp]
    void inhverz(int argc,char*argv[]) /*Funktion inhalt Verzeichnis*/
    {
    DIR *dirHandle;
    int i;
    //char argm4[50];
    struct dirent *dirEntry;
    /*Mit opendir(".")) wird aktuelles Verzeichnis ausgegeben*/
    dirHandle = opendir(argv[4]);
    if (dirHandle)
    {
    while (0 != (dirEntry = readdir(dirHandle)))
    {

    for (i = 0 ; i < argc ; i++)

    {
    printf("%s|",argv[i]);
    }
    puts(dirEntry->d_name);

    }

    printf("%s|%s|%s|%s|%s|***EOF_DIR***\n",argv[0],argv[1],argv[2],argv[3],argv[4]);
    closedir(dirHandle);
    }
    }

    void zeige_rechte(int argc,char *argv[]) /*Zeige Rechte*/
    {
    struct stat attribut;
    int i;
    char l_rwx[10];
    char rwx[] = "rwxrwxrwx";

    int bits[] = {
    S_IRUSR,S_IWUSR,S_IXUSR, /* Zugriffsrechte User /
    //S_IRGRP,S_IWGRP,S_IXGRP, /
    Zugriffsrechte Gruppe /
    //S_IROTH,S_IWOTH,S_IXOTH /
    Zugriffsrechte der Rest */
    };

    while(*++argv) {

    l_rwx[0]='\0';

    // mua|...
    printf("mua|%s|%s|%s|%s|",argv[0],argv[1],argv[2],argv[3]);

    if(stat(argv[3],&attribut) < 0)
    {
    fprintf(stderr, "Fehler bei stat ...\n");
    return ;
    }

    // Verzeichnis ?
    // der - oder d vor rwxrwxrwx
    if(attribut.st_mode & S_IFDIR)
    printf("d");
    else
    printf("-");
    // rwxrwxrwx
    for(i = 0; i < 9; i++)
    {
    /* wenn nicht 0, dann gesetzt */
    if(attribut.st_mode & bits[i])
    l_rwx[i]=rwx[i]; /*r,w oder x*/
    else
    l_rwx[i] = '-'; /*wenn nicht gesetzt, dann '-'*/
    }
    l_rwx[9]='\0';
    printf("%s",l_rwx);

    // Eigentümer
    printf("|USER:%d", attribut.st_uid);
    // Gruppe
    printf("|GROUP:%d", attribut.st_gid);
    // Grosse
    printf("|SIZE:%ld", attribut.st_size);
    // letzte änderung
    printf("|LAST:%s\n", ctime(&attribut.st_mtime));
    return ;
    }[/quote]



  • Brings nicht hinn mit der richtigen anzeige. In Cpp Code



  • Am Anfang vom Code ein

    und am Ende ein
    

    Oder Code markieren und den C/C++ Button unter den 🙂 😃 😉 anklicken.
    (Du musst das [/quote] am Ende durch [/cpp] ersetzen.)
    Das cpp-Tag macht den Code noch farbig und bunt, im Gegensatz zum Code-Tag.

    Und mal den Vorschau-Button benutzen, um zu sehen ob das Ganze auch gut aussieht.

    Hast du dich schon über stat(2) unformiert?
    Auf welchem System (Compiler, Betriebssystem, IDE) programmierst du?
    Wie ist dein Wissensstand?



  • Hier nochmal den Code.
    Habe noch die stat struct eingefügt.
    Ich kompiliere auf XP mit programm code block in C, mit dem GNU GCC Compiler.
    Mein programmierwissensstand ist, (selbsteinschätzung), fortgeschrittener Anfänger.

    Habe die Struct stat eingefügt bei der Funktion zeige Rechte.
    Wie schon im vorigen Beitrag erklärt will ich beim Verzeichniss auslesen bei jedem gelesenem ordner oser Datei im Verzeichnis, gerade dahinter die Rechte anzeigen lassen. Das Problem ist wie übergebe ich die gelesene Datei oder Ordner an die Funktion Rechte weiter. Es sind 4 Argumente die ich eingebe z.B
    mua.exe pr z v Ordner

    wenn im Ordner z.B Datei1,Datei2,Ordner1.... dirn ist ja das dann ddas fünfte Argument. Und wie gebe ich das weite?
    Danke.

    Die Ausgabe sollte so aussehen.z.B auslesen Verzeichniss Ordner

    mua|PR|z|v|Ordner|Datei1|rechte......
    mua|PR|z|v|Ordner|Datei2|rechte......
    mua|PR|z|v|Ordner|ordner2|rechte......
    usw.

    void inhverz(int argc,char*argv[]) /*Funktion inhalt Verzeichnis*/
    {
        DIR *dirHandle;
        int i;
        //char argm4[50];
        struct dirent *dirEntry;
          /*Mit opendir(".")) wird aktuelles Verzeichnis ausgegeben*/
          dirHandle = opendir(argv[4]);
          if (dirHandle)
          {
          while (0 != (dirEntry = readdir(dirHandle)))
             {
    
               for (i = 0 ; i < argc ; i++)
    
                 {
                   printf("%s|",argv[i]);
                 }
                puts(dirEntry->d_name);
    
            }
    
              printf("%s|%s|%s|%s|%s|***EOF_DIR***\n",argv[0],argv[1],argv[2],argv[3],argv[4]);
              closedir(dirHandle);
          }
    }
    
    void zeige_rechte(int argc,char *argv[]) /*Zeige Rechte*/
    {
     struct stat s;
    
        stat(argv[4], &s);
        printf("%-40s : %s\n", "Dateiname", argv[4]);
        printf("%-40s : %d\n", "Dateilaenge", s.st_size);
        printf("%-40s : %ud\n", "Dateiattribute", s.st_mode);
        printf("%-40s : %d\n", "Eigentuemer", s.st_uid);
        printf("%-40s : %d\n", "Gruppe", s.st_gid);
        printf("%-40s : %s\n",
               "Datum der letzten Modifikation", ctime(&s.st_mtime));
        printf("%-40s : %s\n",
               "Datum der letzten Statusaenderung", ctime(&s.st_ctime));
        printf("%-40s : %s\n",
               "Datum des letzten Lesezugriffs", ctime(&s.st_atime));
    
     struct stat attribut;
       int i;
       char l_rwx[10];
       char rwx[] = "rwxrwxrwx";
    
       int bits[] = {
          S_IRUSR,S_IWUSR,S_IXUSR,   /* Zugriffsrechte User    */
          //S_IRGRP,S_IWGRP,S_IXGRP,   /* Zugriffsrechte Gruppe  */
          //S_IROTH,S_IWOTH,S_IXOTH    /* Zugriffsrechte der Rest */
       };
    
    while(*++argv) {
    
           		l_rwx[0]='\0';
    
    		// mua|...
    		printf("mua|%s|%s|%s|%s|",argv[0],argv[1],argv[2],argv[3]);
    
    		if(stat(argv[3],&attribut) < 0)
    		{
    			fprintf(stderr, "Fehler bei stat ...\n");
             		return ;
    		}
    
    		// Verzeichnis ?
    		// der - oder d vor rwxrwxrwx
    		if(attribut.st_mode & S_IFDIR)
    			printf("d");
    		else
    			printf("-");
    		// rwxrwxrwx
          		for(i = 0; i < 9; i++)
    		{
    		/* wenn nicht 0, dann gesetzt */
    		if(attribut.st_mode & bits[i])
    			l_rwx[i]=rwx[i];  /*r,w oder x*/
    		else
    			l_rwx[i] = '-'; /*wenn nicht gesetzt, dann '-'*/
    		}
    		l_rwx[9]='\0';
    		printf("%s",l_rwx);
    
    		// Eigentümer
    		printf("|USER:%d", attribut.st_uid);
    		// Gruppe
    		printf("|GROUP:%d", attribut.st_gid);
    		// Grosse
    		printf("|SIZE:%ld", attribut.st_size);
    		// letzte änderung
    		printf("|LAST:%s\n", ctime(&attribut.st_mtime));
    return ;
       }
    


  • Schreibe eine Funktion, die als Parameter den Datei/Verzeichnisnamen erhält und mit Verzeichnissen und Dateien klarkommt:

    void zeige_rechte(const char *name)
    {
      struct stat s;
      stat(name, &s);
      ...
    }
    
    while(*++argv) {
    
                   l_rwx[0]='\0';
    
            // mua|...
            printf("mua|%s|%s|%s|%s|",argv[0],argv[1],argv[2],argv[3]);
    

    Ich habe nicht verstanden, was das o.g. bewirken soll, abgesehen davon, dass es zu undefiniertem Verhalten führt.



  • Hallo , also ich habe sie funktion mal so gemacht.
    und bei der Funktion Zeige Verzeichniss diese eingefügt aber es passiert nichts. Bekomme keine Rechte angezeigt sonder nor das 5 Agrgument.
    Wenn ich die Funktion so aufrufe

    [cpp]char buf[80];

    strcpy(buf, dirEntry->d_name);
    printf("\n%s\n",buf);

    void zeige_rechte2(const char *buf[]);[/cpp]

    void zeige_rechte2(const char *name)
    {
    
      struct stat s;
      stat(name, &s);
    
      printf("%s","Dateiname");
    
        struct stat attribut;
       int i;
       char l_rwx[10];
       char rwx[] = "rwxrwxrwx";
    
       int bits[] = {
          S_IRUSR,S_IWUSR,S_IXUSR,   /* Zugriffsrechte User    */
          //S_IRGRP,S_IWGRP,S_IXGRP,   /* Zugriffsrechte Gruppe  */
          //S_IROTH,S_IWOTH,S_IXOTH    /* Zugriffsrechte der Rest */
       };
    
    while(*++argv) {
    
           		l_rwx[0]='\0';
    
    		// mua|...
    		printf("mua|%s|%s|%s|%s|",argv[0],argv[1],argv[2],argv[3]);
    
    		if(stat(argv[3],&attribut) < 0)
    		{
    			fprintf(stderr, "Fehler bei stat ...\n");
             		return ;
    		}
    
    		// Verzeichnis ?
    		// der - oder d vor rwxrwxrwx
    		if(attribut.st_mode & S_IFDIR)
    			printf("d");
    		else
    			printf("-");
    		// rwxrwxrwx
          		for(i = 0; i < 9; i++)
    		{
    		/* wenn nicht 0, dann gesetzt */
    		if(attribut.st_mode & bits[i])
    			l_rwx[i]=rwx[i];  /*r,w oder x*/
    		else
    			l_rwx[i] = '-'; /*wenn nicht gesetzt, dann '-'*/
    		}
    		l_rwx[9]='\0';
    		printf("%s",l_rwx);
    
    		// Eigentümer
    		printf("|USER:%d", attribut.st_uid);
    		// Gruppe
    		printf("|GROUP:%d", attribut.st_gid);
    		// Grosse
    		printf("|SIZE:%ld", attribut.st_size);
    		// letzte änderung
    		printf("|LAST:%s\n", ctime(&attribut.st_mtime));
    return ;
    

Log in to reply