Чтение файлов в каталоге с использованием readdir_r и сортировка с использованием qsort
Я пытаюсь написать программу на C, которая читает файлы из каталога и определяет имя, пользователя, группу и размер каждого файла. Информация для каждого файла хранится в массиве struct и сортируется по имени файла с использованием qsort. Сортированные файлы затем выводятся на экран. Эта программа должна использовать readdir_r, getpwuid_r и getgrgid_r. Я не понимаю, как несколько аргументов, которые должны быть предоставлены для "_r" версий этих функций, должны быть реализованы для достижения моей цели. Я также получаю несколько "запросов на имя члена" в чем-то, не являющемся структурой или объединением "(также происходит для" size "," user "и" group ").
Может кто-нибудь помочь мне понять, как я могу правильно использовать функции "_r" в этой ситуации? Страницы руководства не были достаточно ясны для меня, чтобы понять.
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <stddef.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
int main(int argc, char* argv[])
{
DIR *mydir;
struct dirent *myfile;
struct stat mystat;
struct passwd *pwd;
struct group *grp;
struct dirent *result;
struct entry
{
char *name;
char *user;
char *group;
int size;
};
struct entry entries[1024];
if(argc != 2)
{
perror("must supply a directory");
return -1;
}
mydir = opendir(argv[1]);
if(mydir==NULL)
{
perror("Cannot find directory");
return -1;
}
char buf[1024];
while((myfile = readdir_r(mydir, myfile, )) != NULL)
{
entries.name = myfile->d_name;
stat(buf, &mystat);
entries.size = mystat.st_size;
/* store owner's name in struct if it is found using getpwuid_r(). */
if ((pwd = getpwuid_r(mystat.st_uid, , , , ,)) != NULL)
entries.user = pwd->pw_name;
else
perror("user not found");
/* store group name in struct if it is found using getgrgid_r(). */
if ((grp = getgrgid_r(mystat.st_gid, , , , ,)) != NULL)
entries.group = grp->gr_name;
else
perror("group not found");
}
int cmpfunc( const void *a, const void *b)
{
char const *aa = (char const *)a;
char const *bb = (char const *)b;
return strcmp(aa, bb);
}
qsort(entries, 4, sizeof(int), cmpfunc);
int i = 0;
for(int i; i < sizeOf(entries); i++)
{
printf("%s %s %llu %s\n", entries.user, entries.group,
entries.size, entries.name);
}
closedir(mydir);
return 0;
}
1 ответ
Вот пример использования readdir_r()
... вы должны быть в состоянии выяснить другие на основе этого примера:
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
int main(int argc, char *argv[])
{
DIR *mydir;
struct dirent myfile;
struct dirent *result;
int rc;
if (argc != 2) {
perror("must supply a directory");
return -1;
}
mydir = opendir(argv[1]);
if (mydir == NULL) {
perror("Cannot find directory");
return -1;
}
while ((rc = readdir_r(mydir, &myfile, &result)) == 0 && result != NULL ) {
printf("myfile.entryName: -->%s<-- result->d_name: -->%s<--\n",
myfile.d_name,
result->d_name);
}
closedir(mydir);
}