您好,我想用 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);
}