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

【文章摘要

本文以实际的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 -orelease/TestScanDir ScanDirOper.o

rm *.o

四、程序执行结果

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

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

文件放置如图2所示。

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

 

         2.       makefile文件运行过程

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

[email protected]:~/zhouzx/ScanDirOper> make

gcc -c -g ScanDirOper.c

gcc -g -o release/TestScanDir ScanDirOper.o

rm *.o

       3.       程序执行结果

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

[email protected]:~/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,欢迎关注!)

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

时间: 08-02

Linux下的目录扫描操作函数使用实践的相关文章

Linux下environ环境变量操作函数

#include <stdio.h> int main(int argc,char *argv[],char **envptr) { int i=0; for(i=0; envptr[i]!=NULL; i++) printf("%s\n",envptr[i]); return 0; } main函数是程序的入口函数,int main(int argc,char *argv[]); argc是程序参数的个数,argv保存参数 与下边的程序相同的功能 #include <

Linux下的目录创建命令使用实践

[文章摘要] 本文以实际的C源程序为例子,介绍了Linux下的目录创建命令(mkdir)的使用方法,为相关开发工作的开展提供了有益的参考. [关键词] C语言  Linux  目录创建  makefile  开发 一.mkdir命令简介 mkdir命令用来创建指定名称的目录,其命令格式为:mkdir [选项] 目录... 其中,[选项]可以是"-m"."-p"或"-v".此外,目录名是区分大小写的. 二.本程序流程 本文中的程序用于实现创建目录的

linux下文件的读写操作(openreadwrite)

linux下文件的读写操作(openreadwrite) 转 http://www.2cto.com/os/201403/285837.html open(打开文件) 相关函数 read,write,fcntl,close,link,stat,umask,unlink,fopen 表头文件 #include<sys/types.h>#include<sys/stat.h>#include<fcntl.h> 定义函数 int open( const char * path

linux下为目录和文件设置权限,

linux下为目录和文件设置权限,包括子目录的循环递归设置 chmod  命令可以改变所有子目录的权限,下面有2种方法 改变一个文件的权限: chmod mode file|dir 改变所有子目录的权限: chmod mode dir -R                  注意后面加了个-R参数 参数就是权限模式 mode = 777 or 752 ,666,,, mode 的三个数字,分别表示owner,group,others所具有的权限. 1 = x 执行 2 = w 写 4 = r 读

Linux下的目录讲解

Linux下的目录介绍:在Linux系统中,一切东西都是存放在一个唯一的“虚拟文件系统”中的,这个“虚拟文件系统”是树状的结构以一个根目录开始.以文件来表示所有逻辑实体和非逻辑实体,逻辑实体指文件和目录,非逻辑实体泛指硬盘,终端,打印机等等Linux系统是通过“虚拟文件系统-硬盘-硬盘上的分区-分区上的特定文件系统-特定文件系统中的文件”这样的顺序来访问一个文件的.在Linux系统中,主要两个东西:“虚拟文件系统”中的文件和Linux操作系统内核本身.注意:在windows下目录分隔符是\ 而在

linux下为目录和文件设置权限

chmod  命令可以改变所有子目录的权限,下面有2种方法 改变一个文件的权限: chmod mode file|dir 改变所有子目录的权限: chmod mode dir -R                  注意后面加了个-R参数 参数就是权限模式 mode = 777 or 752 ,666,,, mode 的三个数字,分别表示owner,group,others所具有的权限. 1 = x 执行 2 = w 写 4 = r 读,比如owner具有所有权限,1+2+4=7, 又比如gro

Linux下使用skipfish扫描网站漏洞步骤

skipfish是谷歌开发的网站安全扫描工具. tar zxvf skipfish-1.78b.tgz mv skipfish-1.78b skipfish cd skipfish make //编译完成,在目录中生成skipfish可执行程序 cp dictionaries/complete.wl skipfish.wl //拷贝其中一个字典,用来扫描 进行扫描: ./skipfish -o output_folder http://www.example.com //其中output_fol

Linux下mysql的常用操作

Linux下mysql的常用操作: 显示数据库 show databases; 选择数据库 use 数据库名; 显示数据库中的表 show tables; 显示数据表的结构 describe 表名; 显示表中的记录 SELECT * FROM 表名 建库 create databse 库名; 建表 create table 表名 (字段设定列表): mysql> create table name( -> id int auto_increment not null primary key ,

Linux 下使用C语言 gets()函数报错

在Linux下,使用 gets(cmd) 函数报错:warning: the 'gets' function is dangerous and should not be used. 解决办法:采用 fgets(cmd,100,stdin);//100为size 问题解决! fgets从stdin中读字符,直至读到换行符或文件结束,但一次最多读size个字符.读出的字符连同换行符存入缓冲区cmd中.返回指向cmd的指针. gets把从stdin中输入的一行信息存入cmd中,然后将换行符置换成串结