开发者

Reading directory content in linux

How c开发者_运维问答an we read the contents (subdirectories and filenames) of a directory using C language in Linux.


Here is a recursive program to print the name of all subdirectories and files recursively.
Usage: ./a.out path name
Error conditions are not checked for initial path name supplied as command line argument.
Basic flow of code:
All the entries in current directory are read.
if it is directory name, its name is added to path name and and function is called recursively.
else name of the files are printed.

Details about the particular functions can be referenced in respective man pages as pointed by 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]);
}


Relevant functions are opendir, readdir and closedir. I recommend "man opendir" etc


Here is code that will do this (taken from link), hopefully it will get you started on what you are looking for.

#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;
}

Edit: ftw is what is used to walk the filesystem, for more info about it please refer to its man page ftw man page

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜