Linux下的目录扫描操作函数使用实践

时间:2022-08-12 08:36:41

【文章摘要

       本文以实际的C源程序为例子,介绍了Linux下的目录扫描函数(scandir)的使用方法,为相关开发工作的开展提供了有益的参考。

【关键词

       C语言  Linux  目录扫描  makefile  scandir

 

一、scandir命令简介

        scandir函数的声明为:

        int scandir(const char *dir, structdirent ***namelist, int (*filter) (const void *b), int ( * compare )( conststruct dirent **, const struct dirent ** ));

        scandir函数扫描dir目录下(不包括子目录)的满足filter过滤模式的文件,返回的结果是由compare函数经过排序的,并保存在namelist中。对于排序函数,alphasort和versionsort使用得比较多。

        当函数执行成功时,返回的是找到的满足条件的文件的个数,如果执行失败则返回-1。

 

二、本程序流程

        本文中的程序用于实现扫描文件目录的功能。本程序要将满足“Test_”前缀的文件扫描并打印出来,扫描目录为“/zhouzx/TestDir”。

        程序流程如图1所示。

Linux下的目录扫描操作函数使用实践

图1 程序流程图

 

三、C程序源代码及makefile文件内容

       本文中的源程序命名为“ScanDirOper.c”,放置到“ScanDirOper”工程之下,并用makefile对源程序进行编译。最终生成的文件为“TestScanDir”。

       1. “ScanDirOper.c”文件代码内容

/**********************************************************************

* 版权所有 (C)2014, Zhou Zhaoxiong

*

* 文件名称: ScanDirOper.c

* 文件标识:无

* 内容摘要:用于进行目录扫描的相关操作

* 其它说明:无

* 当前版本:V1.0

*         者:周兆熊

* 完成日期:20140804

*

* 修改记录1

* 修改日期: 20140804

* 版  本  号: V1.0

* 修  改  人:周兆熊

* 修改内容:创建

**********************************************************************/

#include <stdio.h>

#include <string.h>

#include <dirent.h>

#include <ftw.h>

 

 

// 数据类型

typedef unsigned char UINT8;

typedef signed   int  INT32;

typedef unsigned int  UINT32;

 

 

// 函数声明

INT32 SelectFlies(const struct dirent *pDir);

INT32 main(void);

 

 

/**********************************************************************

* 功能描述:根据前缀选择文件

* 输入参数: dir-目录

* 输出参数:

* 返  回  值: 0-失败

                       1-成功

* 其它说明:

* 修改日期         版本号    修改人                修改内容

* -----------------------------------------------------------------------------------

*  20140804       V1.0    ZhouZhaoxiong        创建

***********************************************************************/

INT32 SelectFlies(const struct dirent *pDir)

{

    INT32 iPrefixLen  = 0;

    INT32 iLoopFlag   = 0;

    INT32 iSelectResult = 0;

 

    if (pDir == NULL)

    {

        printf("SelectFlies():input parameter is NULL!");

        return 0;

    }

 

    //匹配文件前缀

    iPrefixLen =strlen("Test_");       // 前缀为"Test_"

    iSelectResult = (0 ==strncmp(pDir->d_name, "Test_", iPrefixLen));

    if (iSelectResult ==1)            // 找到了匹配前缀的文件

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

 

 

/****************************************************************

* 功能描述主函数                                           

* 输入参数                                                

* 输出参数                                               

* 返  回  : 0-执行成功

                   -1-执行失败

* 其他说明                                               

* 修改日期       版本号        修改人               修改内容

* --------------------------------------------------------------------------

*  20140804        V1.0     Zhou Zhaoxiong     创建

****************************************************************/

INT32 main(void)

{

    UINT8   szDirectory[256]  = {0};

    INT32   iRetValue       = 0;

    struct     dirent**namelist  = NULL;

    UINT32   iLoopFlag      = 0;

 

    memcpy(szDirectory,"/zhouzx/TestDir", strlen("/zhouzx/TestDir"));

 

    // scandir函数来选择文件, 选出来的文件按照字母表顺序排列

    iRetValue =scandir(szDirectory, &namelist, SelectFlies, alphasort);

 

    // 返回负值,是因为没有扫描目录,或扫描出错

    if (iRetValue < 0)

    {

        printf("Execscandir failed, please check!");

        return -1;

    }

 

    printf("The amount of scanded fileis:%d\n", iRetValue);

 

     // 将扫描到的文件打印出来

    for (iLoopFlag = 0;iLoopFlag < iRetValue; iLoopFlag ++)

    {

        printf("Thescanded file %d is:%s\n", iLoopFlag +1, namelist[iLoopFlag]->d_name);

    }

        

    return 0;

}

        2. makefile文件的内容

TestScanDir : ScanDirOper.c

       gcc -c -g ScanDirOper.c

       gcc -g -o release/TestScanDir ScanDirOper.o

       rm *.o    

 

四、程序执行结果

        将本工程文件传到Linux机器上。

        1.       扫描目录下的文件放置

        文件放置如图2所示。

Linux下的目录扫描操作函数使用实践

图2 扫描目录下的文件放置

 

         2.       makefile文件运行过程

         在makefile文件所在目录下(“ScanDirOper”工程之下)输入“make”命令,执行结果如下:

zhou@linux:~/zhouzx/ScanDirOper> make

gcc -c -g ScanDirOper.c

gcc -g -o release/TestScanDir ScanDirOper.o

rm *.o

 

       3.       程序执行结果

       转到release目录下,输入“TestScanDir”,执行结果如下:

zhou@linux:~/zhouzx/ScanDirOper/release> TestScanDir

The amount of scanded file is:3

The scanded file 1 is:Test_1.txt

The scanded file 2 is:Test_2.txt

The scanded file 3 is:Test_3.txt

 

        对照图2可知,满足条件的文件被全部扫描出来了。

 

       五、总结

       本文用一个实际的C程序为例来说明了目录扫描函数(scandir)的使用方法。总的说来,该函数在Linux相关函数操作中使用得比较的广泛,大家一定要学会其用法。



(本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)