Как получить имена файлов и имена подкаталогов из каталога в C? - PullRequest
1 голос
/ 28 октября 2010

Хорошо, у меня есть что-то вроде этого:

struct dirent *dp;
DIR *dir;
char fullname[MAXPATHLEN];
char** tmp_paths = argv[1]; //Not the exact code but you get the idea.

...

while ((dp = readdir(dir)) != NULL)
{
    struct stat stat_buffer;

    sprintf(fullname, "%s/%s", *tmp_paths, dp->d_name);

    if (stat(fullname, &stat_buffer) != 0)
        perror(opts.programname);

    /* Processing files */
    if (S_ISDIR(stat_buffer.st_mode))
    {
        nSubdirs++;
        DIRECTORYINFO* subd = malloc(BUFSIZ);
    }

    /* Processing subdirs */
    if (S_ISREG(stat_buffer.st_mode))
    {
        nFiles++;
        FILEINFO *f = malloc(BUFSIZ);
    }
}

Как мне прочитать имена файлов и подкаталогов в моей собственной структуре DIRECTORYINFO и FILEINFO? Я просмотрел stat.h и не нашел ничего полезного.

Ответы [ 3 ]

1 голос
/ 28 октября 2010

В мире UNIX имя не является частью файла, поэтому stat(2) не может получить информацию о нем. Но в вашем коде у вас есть имя dp->d_name, поэтому вы можете скопировать эту строку в вашу собственную структуру данных. Это должно быть довольно просто.

Если это не ваша проблема, я не понял вопроса.

0 голосов
/ 29 мая 2011

Глоб твой друг

Функция glob () ищет все пути, соответствующие шаблону, в соответствии с правилами, используемыми оболочкой

/* Sample Code */
#include <glob.h>    
glob_t data;
glob("*", 0, NULL, &data ); /* Here "*" says to match all files of the current dir */
for(int i=0; i<data.gl_pathc; i++)
{
    /* Printing all the path names,Just for illustration */
    printf( "%s\n", data.gl_pathv[i] );
}
/* To split into DIRINFO and FILEINFO, stat(2) should be made use of */
globfree( &data ); /* free the data structure */

Для получения более подробной информации вы всегда можете использовать Unix man page

человек глобус

0 голосов
/ 28 октября 2010

Взгляните на этот вопрос и ответы на него. Вы, вероятно, хотите использовать dirent->d_name.

...