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

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

【文章摘要

       本文以实际的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所示。

图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所示。

图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,欢迎关注!)

目录
相关文章
|
10天前
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
53 19
|
12天前
|
Linux Android开发 开发者
linux m、mm、mmm函数和make的区别
通过理解和合理使用这些命令,可以更高效地进行项目构建和管理,特别是在复杂的 Android 开发环境中。
45 18
|
11天前
|
Linux
linux查看目录下的文件夹命令,find查找某个目录,但是不包括这个目录本身?
通过本文的介绍,您应该对如何在 Linux 系统中查看目录下的文件夹以及使用 `find` 命令查找特定目录内容并排除该目录本身有了清晰的理解。掌握这些命令和技巧,可以大大提高日常文件管理和查找操作的效率。 在实际应用中,灵活使用这些命令和参数,可以帮助您快速定位和管理文件和目录,满足各种复杂的文件系统操作需求。
32 8
|
20天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
88 13
|
1月前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
1月前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
2月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
172 3
|
2月前
|
Linux Python
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
在 Linux 系统中,了解目录下文件数量是常见的需求。本文介绍了四种方法:使用 `ls` 和 `wc` 组合、`find` 命令、`tree` 命令以及编程实现(如 Python)。每种方法都附有详细说明和示例,适合不同水平的用户学习和使用。掌握这些技巧,可以有效提升系统管理和日常使用的效率。
885 6
|
2月前
|
分布式计算 Java Hadoop
linux中HADOOP_HOME和JAVA_HOME删除后依然指向旧目录
通过以上步骤,可以有效地解决 `HADOOP_HOME`和 `JAVA_HOME`删除后依然指向旧目录的问题。确保在所有相关的配置文件中正确设置和删除环境变量,并刷新当前会话,使更改生效。通过这些措施,能够确保系统环境变量的正确性和一致性。
32 1
|
Linux
Linux查看操作系统版命令
Linux查看操作系统版命令
108 0

热门文章

最新文章