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



您好,我想用 c 制作一个程序,该程序接收目录名称作为参数,以 rwx 格式显示其中的所有文件及其权限,代码如下:

DIR* midir;
if ((midir=opendir(argv[1])) < 0) {
    perror("nError en opendirn");
    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("nn");
}
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

感谢帮助。

您正在请求当前工作目录中的文件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 namen");
        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);
}

相关内容

  • 没有找到相关文章

最新更新