您好我想在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
非常感谢帮助。
答案 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);
}