Чтение содержимого каталога в Linux - PullRequest
4 голосов
/ 20 апреля 2011

Как мы можем прочитать содержимое (подкаталоги и имена файлов) каталога, используя язык Си в Linux.

Ответы [ 3 ]

6 голосов
/ 21 апреля 2011

Вот рекурсивная программа для рекурсивной печати названия всех подкаталогов и файлов.
Использование: ./a.out путь
Условия ошибки не проверяются для исходного имени пути, предоставленного в качестве аргумента командной строки.
Основной поток кода:
Все записи в текущем каталоге читаются.
если это имя каталога, его имя добавляется в путь и функция вызывается рекурсивно.
иначе имена файлов печатаются.

Подробную информацию о конкретных функциях можно найти на соответствующих страницах руководства, как указано dmuir:

#include<sys/stat.h>
#include<unistd.h>
#include<dirent.h>
#include<error.h>
int read(char *pth)
{
    char path[1000];
    strcpy(path,pth);
    DIR *dp;
    struct dirent *files;
    /*structure for storing inode numbers and files in dir
    struct dirent
    {
        ino_t d_ino;
        char d_name[NAME_MAX+1]
    }
    */
    if((dp=opendir(path))==NULL)
        perror("dir\n");
    char newp[1000];
    struct stat buf;
    while((files=readdir(dp))!=NULL)
    {
              if(!strcmp(files->d_name,".") || !strcmp(files->d_name,".."))
                continue;

        strcpy(newp,path);
        strcat(newp,"/");
        strcat(newp,files->d_name); 
            printf("%s\n",newp);

            //stat function return a structure of information about the file    
        if(stat(newp,&buf)==-1)
        perror("stat");
        if(S_ISDIR(buf.st_mode))// if directory, then add a "/" to current path
        {

            strcat(path,"/");
            strcat(path,files->d_name);
            read(path);
            strcpy(path,pth);
        }
    }
}
int main(int argc,char *argv[])
{

    read(argv[1]);
}
4 голосов
/ 20 апреля 2011

Соответствующими функциями являются opendir, readdir и closedir.Я рекомендую "man opendir" и т. Д.

2 голосов
/ 20 апреля 2011

Вот код, который сделает это (взят из ссылка ), надеюсь, он поможет вам начать то, что вы ищете.

#include <ftw.h>
#include <stdio.h>
#include <sys/stat.h>

int list(const char *name, const struct stat *status, int type);

int main(int argc, char *argv[]) {

 if(argc == 1)
  ftw(".", list, 1);
 else
  ftw(argv[1], list, 1);

 return 0;
}

// FTW_F    The object is a  file
// FTW_D    ,,    ,,   ,, ,, directory
// FTW_DNR  ,,    ,,   ,, ,, directory that could not be read
// FTW_SL   ,,    ,,   ,, ,, symbolic link
// FTW_NS   The object is NOT a symbolic link and is one for 
//          which stat() could not be executed
int list(const char *name, const struct stat *status, int type) {
 if(type == FTW_NS)
  return 0;

 if(type == FTW_F)
  printf("0%3o\t%s\n", status->st_mode&0777, name);

 if(type == FTW_D && strcmp(".", name) != 0)
  printf("0%3o\t%s/\n", status->st_mode&0777, name);

 return 0;
}

Редактировать: ftw - это то, чтоиспользуется для обхода файловой системы, для получения дополнительной информации о ней, пожалуйста, обратитесь к его справочной странице ftw man page

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...