目录检索

来源:互联网 发布:三菱plc编程步进视频 编辑:程序博客网 时间:2024/06/06 03:07

目录检索 - 遍历目录

功能:遍历目录指定或当前目录下所有文件。
实现:通过文件I/O函数,目录检索相关API组合实现功能

  • 根据输入文件名,opendir()获得文件指针;
DIR *dp = opendir(pathname);
  • readdir()取得目录项到结构体;
struct dirent *dirp;while((dirp = readdir(dp)) != NULL)

目录项是一个个的读取,它是包含了文件索引号,目录项大小,文件类型,文件名这一类信息的结构体,定义如下:

struct dirent{    ino_t d_ino;    off_t d_off;    unsigned short d_reclen;    unsigned char d_type;    char d_name[256];}
  • 组合路径与文件名;
if(pathname[strlen(pathname)-1] == '/')    sprintf(name, "%s%s", pathname, dirp->d_name);else    sprintf(name, "%s/%s", pathname, dirp->d_name);
  • stat()取得文件信息,判断是文件就直接输出,是目录继续调用自己,重复以上操作。
struct stat filestat;if(!S_ISDIR(filestat.st_mode))    printf("[%7ld]  %s\n", filestat.st_size, pathname);else    open_add_path(pathname);

struct stat 文件控制信息结构体如下:

struct stat{    dev_t         st_dev;       //文件的设备编号    ino_t         st_ino;       //节点    mode_t        st_mode;      //文件的类型和存取的权限    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1    uid_t         st_uid;       //用户ID    gid_t         st_gid;       //组ID    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号    off_t         st_size;      //文件字节数(文件大小)    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)    unsigned long st_blocks;    //块数    time_t        st_atime;     //最后一次访问时    time_t        st_mtime;     //最后一次修改时    time_t        st_ctime;     //最后一次改变时间(指属性)}

代码贴

#include <stdio.h>#include <dirent.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#define NANE_SIZE 200int open_add_path(char const*pathname){    char name[NANE_SIZE];    struct dirent *dirp;    DIR *dp = opendir(pathname);    if(dp == NULL)        return -1;    while((dirp = readdir(dp)) != NULL)    {        if(!(strcmp(dirp->d_name, ".") &&             strcmp(dirp->d_name, "..")))            continue;        else        {            memset(name, 0, sizeof(name));            if(pathname[strlen(pathname)-1] == '/')                sprintf(name, "%s%s", pathname, dirp->d_name);            else                sprintf(name, "%s/%s", pathname, dirp->d_name);            //printf("%s\n", name);            struct stat filestat;            if(stat(name, &filestat) < 0)                return -1;            if(!S_ISDIR(filestat.st_mode))                printf("[%7ld]  %s\n", filestat.st_size, name);            else            {                printf("[%7ld]  \033[0;33m%s\033[0m\n", filestat.st_size, pathname);                open_add_path(name);    // 如果是目录继续打开并获取路径            }        }    }    return 0;}int main(int argc, char const *argv[]){    if(argc == 1)        open_add_path(".");    else        open_add_path(argv[1]);    return 0;}
原创粉丝点击