如何遍历c中的目录并打印所有文件的名称和权限

时间:2013-12-25 18:45:49

标签: c stat readdir opendir

您好我想在c中创建一个程序,它接收一个目录的名称作为参数,显示其中的所有文件及其以rwx格式的权限, 这是代码:

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 :(得分:2)

您正在请求当前工作目录中的stat个文件,而不是midir中的文件 - 并且调用失败,因为您请求统计信息的文件不存在于那里。如果您检查了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);
}