2013-12-25 5 views
1

Привет, я хочу сделать программу в c, которая получает имя каталога в качестве аргумента, показывает все файлы в нем и их разрешения в формате rwx, вот код:Как пройти через каталог в c и распечатать все имена и разрешения файлов

DIR* midir; 
if ((midir=opendir(argv[1])) < 0) { 
    perror("\nError en opendir\n"); 
    exit(-1); 
} 
struct dirent* info_archivo; 
struct stat fileStat; 

while ((info_archivo = readdir(midir)) != NULL) { 
    stat(info_archivo->d_name, &fileStat); 
    printf((S_ISDIR(fileStat.st_mode)) ? "d" : "-"); 
    printf((fileStat.st_mode & S_IRUSR) ? "r" : "-"); 
    printf((fileStat.st_mode & S_IWUSR) ? "w" : "-"); 
    printf((fileStat.st_mode & S_IXUSR) ? "x" : "-"); 
    printf((fileStat.st_mode & S_IRGRP) ? "r" : "-"); 
    printf((fileStat.st_mode & S_IWGRP) ? "w" : "-"); 
    printf((fileStat.st_mode & S_IXGRP) ? "x" : "-"); 
    printf((fileStat.st_mode & S_IROTH) ? "r" : "-"); 
    printf((fileStat.st_mode & S_IWOTH) ? "w" : "-"); 
    printf((fileStat.st_mode & S_IXOTH) ? "x" : "-"); 
    printf("\n\n"); 
} 
closedir(midir); 

выход это неправильно получает файлы имя правильно, но разрешения неправильно:

..: permissions: drwxr-xr-x 

file1: permissions: drwxr-xr-x 

file3: permissons: drwxr-xr-x 

.: permissions: drwxr-xr-x 

file2: permissions: drwxr-xr-x 

Помощь ценится.

+1

И какими будут * фактические * разрешения? –

+0

Привет, они одинаковы для трех файлов: -rw-rw-r-- – Mustapha

+2

Вы запрашиваете 'stat' файла в текущем рабочем каталоге, а не в вашем' midir'. Если вы проверили возвращаемое значение 'stat', вы бы это заметили. (О, и поэтому 'fileStat' не изменяется, поэтому вы получаете тот же« результат »снова и снова.) – usr2564301

ответ

2

Вы запрашиваете stat файлов в вашем текущем рабочем каталоге, а не те, что указаны в вашем midir, - и вызовы завершаются сбоем, потому что файлы, которые вы запрашиваете stat, там не существуют. Если вы проверили возвращаемое значение stat, вы бы это заметили, так как он возвращает 0 при успешном завершении. Как бы то ни было, fileStat не будет изменен в случае ошибки, и вы получите тот же «результат» снова и снова.

С момента запроса файла stat для может быть находиться за пределами текущего рабочего каталога, вам необходимо добавить его полный путь. Предполагая, что 256 байтов достаточно длинны для ваших путей, а ваш разделитель пути - /, должен работать следующий подход.

#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 
#include <err.h> 
#include <sys/stat.h> 
#include <string.h> 

int main (int argc, char **argv) 
{ 
    DIR *midir; 
    struct dirent* info_archivo; 
    struct stat fileStat; 
    char fullpath[256]; 

    if (argc != 2) 
    { 
     perror("Please supply a folder name\n"); 
     exit(-1); 
    } 

    if ((midir=opendir(argv[1])) == NULL) 
    { 
     perror("Error in opendir"); 
     exit(-1); 
    } 

    while ((info_archivo = readdir(midir)) != 0) 
    { 
     printf ("%s ", info_archivo->d_name); 
     strcpy (fullpath, argv[1]); 
     strcat (fullpath, "/"); 
     strcat (fullpath, info_archivo->d_name); 
     if (!stat(fullpath, &fileStat)) 
     { 
      printf((S_ISDIR(fileStat.st_mode)) ? "d" : "-"); 
      printf((fileStat.st_mode & S_IRUSR) ? "r" : "-"); 
      printf((fileStat.st_mode & S_IWUSR) ? "w" : "-"); 
      printf((fileStat.st_mode & S_IXUSR) ? "x" : "-"); 
      printf((fileStat.st_mode & S_IRGRP) ? "r" : "-"); 
      printf((fileStat.st_mode & S_IWGRP) ? "w" : "-"); 
      printf((fileStat.st_mode & S_IXGRP) ? "x" : "-"); 
      printf((fileStat.st_mode & S_IROTH) ? "r" : "-"); 
      printf((fileStat.st_mode & S_IWOTH) ? "w" : "-"); 
      printf((fileStat.st_mode & S_IXOTH) ? "x" : "-"); 
     } else 
     { 
      perror("Error in stat"); 
     } 
     printf("\n"); 
    } 
    closedir(midir); 
}