系统调用----sandir

scandir函数用于读取指定目录的数据,通过select函数进行筛选,并使用compar函数进行排序。示例代码展示了如何使用scandir配合自定义filter函数筛选以'get'开头的文件名,并使用alphasort进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scandir函数:读取特定的目录数据
表头文件:#include  
定义函数:int  scandir(const char *dir, struct dirent **namelist, nt (*select)  (const  struct  dirent *), nt         
              (*compar)  (const struct dirent **, const struct dirent**));
函数说明:
         scandir()会扫描参数dir指定的目录文件,经由参数select指定的函数来挑选目录结构至参数namelist数组中,最后再调用
参数compar指定的函数来排序namelist 数组中的目录数据。每次从目录文件中读取一个目录结构后便将此结构传给参数select所指的
函数, select函数若不想要将此目录结构复制到namelist数组就返回0,若select为空指针则代表选择所有的目录结构。scandir()会
调用 qsort()来排序数据,参数compar则为qsort()的参数,若是要排列目录名称字母则可使用alphasort(). 结构dirent定义请参考
readdir()
返回值  :成功则返回复制到namelist数组中的数据结构数目,有错误发生则返回-1
错误代码:ENOMEM 核心内存不足
Example
/* print files in current directory in reverse order */
#include
main()
{
    struct dirent **namelist;
    int n;
    n = scandir(".", &namelist, 0, alphasort);
    if (n d_name);
            free(namelist[n]);
        }
        free(namelist);
    }
}

2:=========================================================

 

代码如下:
#include <dirent.h>
#include <stdio.h>

// 自定义的过滤器函数
// 本函数只能做为 scandir 函数的参数,被 scandir 函数回调
// 注:1. 本函数不能被定义为 static int custom_filter( const struct dirent *pSDirent ) 静态函数;
//   2. 参数一定要为 const struct dirent *pSDirent 不可省略前面的 const ;
int
custom_filter( const struct dirent *dp )
{
    if ( 0 == strncmp( "get",
                       dp->d_name,
                       3 ) )
    {
        // 非零为保留 - 不滤掉
        return 1;
    }
   
    // 零为过滤掉 - 过滤掉
    return 0;
    
 
void main()
{
    struct dirent **namelist;
    int i;
    int total;
   
    total = scandir( "./",
                     &namelist,
                     custom_filter,
                     alphasort );
                     
    if ( total < 0 )
    {
        printf( "scandir fault\n" );
    }
    else
    {
        for( i = 0;
             i < total;
             i++ )
        {
            printf( "%s\n",
                    namelist[i]->d_name );
        }
       
        printf( "total = %d\n",
                total );
    }
}

结果如下:
不加 custom_filter 过滤函数的情况
    total = scandir( "./",
                     &namelist,
                     0,
                     alphasort );
wzhnsc@wzhnsc-Ubuntu:/media/TestSrc$ ./getselfname
.
..
getselfname
getselfname.c
total = 4

加了 custom_filter 过滤函数的情况
    total = scandir( "./",
                     &namelist,
                     custom_filter,
                     alphasort );
wzhnsc@wzhnsc-Ubuntu:/media/TestSrc$ ./getselfname
getselfname
getselfname.c
total = 2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值