【文章摘要】
本文以实际的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,欢迎关注!)