Linux下递归遍历文件和文件夹

#include
#include
#include
#include
#include
#include
#include
//利用深度优先遍历实现文件检索
void dfs(const char *filedir)
{
    struct stat dirstat;
    if(stat(filedir,&dirstat)==-1)
    {
        printf("cant access to %s",filedir);
        exit(1);
    }

    if(dirstat.st_mode & S_IFDIR)
    {
        struct dirent *entry;
        DIR * dir;
        dir = opendir(filedir);
        printf("%s\n",filedir);
        while((entry = readdir(dir))!=NULL)
        {
            if(!strcmp(entry->d_name,".")||!strcmp(entry->d_name,".."))continue;
            char src[255];
            strcpy(src,filedir);
            strcat(src,"/");
            chdir(strcat(src,entry->d_name));
            dfs(src);
            chdir(filedir);
        }
    }
    else
    {
        printf("--%s\n",filedir);
    }

}
int main(int argc,char *args[])
{
    if(argc!=2)
    {
        printf("tree filedir");
    }
    dfs(args[1]);
    return 0;
}

 

在Linux下检索文件跟windows下一样,只不过文件结构稍有不同,需要了解linux下的文件存储方式

struct stat 是一个指向文件指针的结构体。查看stat的信息可以通过man 2 struct stat查看 如下

struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is NOT defined */

         dev_t    st_dev;    /* device inode resides on */

         ino_t    st_ino;    /* inode's number */

         mode_t   st_mode;   /* inode protection mode */

         nlink_t  st_nlink;  /* number of hard links to the file */

         uid_t    st_uid;    /* user-id of owner */

         gid_t    st_gid;    /* group-id of owner */

         dev_t    st_rdev;   /* device type, for special file inode */

         struct timespec st_atimespec;  /* time of last access */

         struct timespec st_mtimespec;  /* time of last data modification */

         struct timespec st_ctimespec;  /* time of last file status change */

         off_t    st_size;   /* file size, in bytes */

         quad_t   st_blocks; /* blocks allocated for file */

         u_long   st_blksize;/* optimal file sys I/O ops blocksize */

         u_long   st_flags;  /* user defined flags for file */

         u_long   st_gen;    /* file generation number */

     };

我们可以通过获得stat的一些属性知道inode 号和记录属性等,inode记录文件位置等信息,从而找到磁盘中的数据。在这里我们用stat的属性区分文件还是文件夹,然后利用opendir获取文件目录,readdir依此读取目录中文件。如有疑问或者错误欢迎大家留言讨论,原创 转载请说明出处

你可能感兴趣的:(Linuxc)