Linux的scandir函数

Linux的scandir函数学习目的:熟悉linux下scandir函数的使用1、函数的功能遍历指定目录下满足某种过滤模式的文件,返回结果可通过指定函数进行排序,并将返回的子目录信息(不递归遍历子目录的目录)存放到函数内部动态分配的内存中,我们可通过访问返回结果获取当前路径下目录的信息。2、函数的原型intscan

大家好,欢迎来到IT知识分享网。

学习目的:

  • 熟悉linux下scandir函数的使用

1、函数的功能

  遍历指定目录下满足某种过滤模式的文件,返回结果可通过指定函数进行排序,并将返回的子目录信息(不递归遍历子目录的目录)存放到函数内部动态分配的内存中,我们可通过访问返回结果获取当前路径下目录的信息。


2、函数的原型

int scandir(const char *dirp, struct dirent ***namelist,
              int (*filter)(const struct dirent *),
              int (*compar)(const struct dirent **, const struct dirent **));

dirp: 指定扫描的目录

namelist:  struct dirent结构体类型的三级指针,用于获取该函数内部为存放返回结果的分配的动态内存

                scadir函数内部使用malloc动态分配内存,用以保存遍历到的目录相关信息,动态分配内存结构如图2-1所示。分配的内存包含两个部分,一部分是struct dirent类型指针(一段连续内存,可看成指针数组),用于指向malloc分配用来存放目录信息内存地址,另一部分是malloc分配struct dirent大小内存,存放遍历目录或文件的相关信息。若想获取目录相关信息,需要先获取指向该存放内存的指针,即图2-1中的strcut dirent *arr[N]指针数组地址。

Linux的scandir函数

 图2-1 scandir函数内部存储目录动态内存描述

 

filter: 函数指针,指向过滤模式函数。当filter指针设置为NULL时,扫描dirp目录下的所有顶层文件

compar: 函数指针,指向对遍历结果进行排序函数,alphasort函数和versionsort是经常用到的函数,alphasort根据字母先后对返回结果进行排序


3、函数使用

scandir_test.c—–>参考man page提供代码

#define _SVID_SOURCE
 /* print files in current directory in reverse order */
#include <dirent.h>

int main(void)
{
    struct dirent **namelist;              
    int n;

    n = scandir(".", &namelist, NULL, alphasort);
    if (n < 0)
        perror("scandir");
    else 
    {
        while (n--) 
        {
            printf("%s\n", namelist[n]->d_name);
            free(namelist[n]);  //------------------------>①每访问完一条目录或文件信息,释放由malloc分配的用于存放该信息的动态内存
        }
        free(namelist);         //------------------------>②访问完指定目录下所有目录或文件信息内容,释放malloc分配的用于索引的指针数组内存
    }
}
            

注:使用scandir函数获取相关信息之后,务必像上述代码①、②所示调用free函数释放内部由malloc分配内存(内存结构描述如图2-1所示)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30219.html

(0)
上一篇 2023-11-25 20:00
下一篇 2023-11-25 20:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信