Linux下快速获取文件名的编程方法

Linux下快速获取文件名的编程方法

1. 通过Linux 命令行的方法进行过滤,并重定向到一个临时文件中,之后通过编程读取每一行的内容即可;
2. 通过 scandir 函数进行处理,使用的是快速排序的方法。

1. candir的函数定义
#include <dirent.h>
int scandir( const char *dirp, 
			 struct dirent ***namelist,
             int (*filter)(const struct dirent *),
             int (*compar)(const struct dirent **, const struct dirent **));
            

对上述函数的参数进行解释:

  1. dirp: 需要获取所有文件名的目录;
  2. namelist: 保存过滤后的全部文件名;
  3. filter: 过滤函数,为NULL时,输入全部,否则将用filter进行过滤输出;
  4. compar:表示用来快速排序的参数,可以进行按字母排序的方式;
  5. 返回值:过滤后符合的总数。
2. candir的使用
#include <dirent.h>
int alphasort(const struct dirent **a, const struct dirent **b);
int versionsort(const struct dirent **a, const struct dirent **b);

scandir 函数中的 compar 参数使用上述的两个函数作为参数,alphasort 表示使用字母来进行快速排序,versionsort 表示使用版本来进行排序。一般情况下,使用 alphasort 函数即可完成很多需要排序的工作。

3. 实例
#include <stdlib.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>

int wav_filter(const struct dirent *dir)
{
	const char *name = dir->d_name;
	int len = strlen(name);
	if(4 > len)
	{
		return 0;
	}
	else
	{
		name = name + (len - 4);
		if(0 == strncasecmp(name, ".wav", 4))
		{
			return 1;
		}
		else 
		{
			return 0;
		}
	}
}
int main(int argc, char const *argv[])
{
	struct dirent **entry_list;
	int count = -1;
	int i;
	
	count = scandir("./files", &entry_list, wav_filter, alphasort);
	if(count < 0)
	{
		printf("\nscandir failed\n");
		return -1;
	}
	printf("count = %d\n", count);

	for(i = 0; i < count; i++)
	{
		struct dirent *entry;
		entry = entry_list[i];
		printf("%s --- %d \n", entry->d_name, entry->d_type);
		free(entry);
	}
	free(entry_list);
	return 0;
}

例子中过滤了文件的类型必须是已".wav"作为后缀的文件,为了能够说明该函数进行数据的获取的快速方标,作者使用shell文件进行了创建3000和文件,其中1900个为wav后缀格式的文件,剩余的为txt后缀文件,并且已时间作为前缀。 如下:

#!/bin/bash

cnt=0
rm ./files -rf

mkdir -p ./files


while [ $cnt -lt 3000 ]
do
	let cnt=$cnt+1
	times=`date +%Y%m%d%H%M%S%05N`
	if [ $cnt -lt 1900 ];then
		touch ./files/$times.wav
	else
		touch ./files/$times.txt
	fi

done
3. 显示结果:
编译: gcc test.c -o test
运行: time ./test

在这里插入图片描述
实际上的时间显示为0.11秒,也即是说是110毫秒就可以获取到1900个特定格式的文件。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值