美文网首页
LINUX下用C语言历遍目录 dirent.h在C/C++中的使

LINUX下用C语言历遍目录 dirent.h在C/C++中的使

作者: 东京的雨不会淋湿首尔 | 来源:发表于2019-12-06 21:31 被阅读0次

    LINUX下历遍目录的方法一般是这样的
    打开目录-》读取-》关闭目录
    相关函数是
    opendir -> readdir -> closedir

    #include <dirent.h>
    DIR *opendir(const char *dirname);
    
    
    #include <dirent.h>
    struct dirent *readdir(DIR *dirp);
    
    
    #include <dirent.h>
    int closedir(DIR *dirp);
    

    好了,三个函数都出来了,原型就是上面,给自己解释一下免得以后我自己忘了!我
    opendir用于打开目录,是类似于流的那种方式,返回一个指向DIR结构体的指针他的参数*dirname是一个字符数组或者字符串常量,
    readdir函数用于读取目录,他只有一个参数,这个参数主opendir返回的结构体指针,或者叫句柄更容易理解些吧。这个函数也返回一个结构体指针 dirent *
    dirent的结构如下定义

    struct dirent
    {
    long d_ino;                     
    off_t d_off;                    
    unsigned short d_reclen;        
    char d_name [NAME_MAX+1];       
    }
    

    结构体中d_ino存放的是该文件的结点数目,什么是结点数目呢我也说不清楚了呵呵,查一下其它资料了(这里应该不是节点数目,而是其下文件的索引节点号inode)
    d_off 是文件在目录中的编移,具体是什么意思我也不是很明白,我很少用到它,其本上就是用到d_name ,short d_reclen是这个文件的长度,需要注意的是这里的长度并不是指文件大小,因为大小和长度是2回事了,你可以用lseek将文件长度移得很长,但大小其实还是那么大.最后一个元素就是我们要的了,文件名称!
    写了一个实例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <dirent.h>
    void print_usage(void);
    
    void print_usage(void)
    {
    printf("Usage: test dirname\n");
    }
    
    int main(int argc,char *argv[])
    {
    DIR * dp;
    struct dirent *filename;
    
    if (argc < 2)
    {
    print_usage();
    exit(1);
    }
    
    dp = opendir(argv[1]);
    if (!dp)
    {
    fprintf(stderr,"open directory error\n");
    return 0;
    }
    while (filename=readdir(dp))
    {
    printf("filename:%-10s\td_info:%ld\t d_reclen:%us\n",
    filename->d_name,filename->d_ino,filename->d_reclen);
    }
    closedir(dp);
    return 0;
    }
    

    相关文章

      网友评论

          本文标题:LINUX下用C语言历遍目录 dirent.h在C/C++中的使

          本文链接:https://www.haomeiwen.com/subject/segegctx.html