首页 > 技术文章 > 遍历文件夹

fedorayang 2016-08-15 17:17 原文

使用ffmpeg移植一个音频解码的功能,发现头文件太多了,真正用到的很少,怎么把这些无用的头文件清除呢?
刚开始想使用sed,gwak进行处理,发现自己用的不熟练,一时半会弄不好。
突然想到可以自己用C语言写个程序啊,遍历文件夹处理。
算法思路是这样的:
1.编译程序,依赖文件名都放在.d文件里了,遍历文件夹找到.d文件。
2.读取*.d文件的内容,过滤出来头文件名,把所有头文件名放在一个文件中
3.遍历完所有文件夹后,就得到了包含所有头文件名的一个文件
4.遍历所有文件夹,得到所有头文件
5.所有头文件名 - 使用的头文件,就是无用的头文件
6.把无用的头文件删除

程序使用的C语言知识点:
1.递归函数
2.函数指针
3.回调函数

代码如下:

include <inttypes.h>

include <stdio.h>

include <stdlib.h>

include <unistd.h>

include <string.h>

include <sys/mount.h>

include <sys/statfs.h>

include <dirent.h>

define FILE_DEPDENCY "/tmp/dfile.fedora"

define FILE_DEPDENCY_SORT "/tmp/dfile_sort.fedora"

define FILE_HEADER "/tmp/hfile.fedora"

define FILE_HEADER_SORT "/tmp/hfile_sort.fedora"

define FILE_TO_DELETED "/tmp/delete.fedora"

define USAGE_HELP "Usage:cmd option1 option2 option3 ...\n" \

"descriptions1\n" \
"descriptions2\n" \
"descriptions3 ...\n"

define STR_LEN 2048

static FILE* sg_fpDep;
static FILE* sg_fpHeader;
static FILE* sg_fpDelete;

static void parse_dep_file(char* filename)
{
FILE* fp=fopen(filename,"r");
char str[STR_LEN];
uint32_t line_cnt=0;
if(NULL==fp)
{
fprintf(stderr,"open dep file error!\n");
}

while(NULL!=fgets(str,STR_LEN,fp))
{
	char *p;
	//fprintf(stdout,"line_cnt=%"PRIu32"--------------\n",line_cnt++);
	p=strtok(str," ");
	while(NULL!=p)
	{
		if(NULL!=strstr(p,".h"))
		{
			fprintf(sg_fpDep,"%s\n",p);
		}
		p=strtok(NULL," ");
	}
	//fprintf(stdout,"%s",str);
}

fclose(fp);	

}

typedef int (*DIR_OP)(char name[],int d_type);

static void dir_traverse(char* dirName, char* filter, DIR_OP op)
{
DIR* pDir;

if(0==strcmp(".git",dirName))
{
	return;
}
 pDir=opendir(dirName);
if(NULL==pDir)
{
	fprintf(stderr,"open dir error!\n");
	return;
}


struct dirent* pEntry;

while(NULL != (pEntry= readdir(pDir)))
{
	while((strcmp(pEntry->d_name, ".") == 0) || (strcmp(pEntry->d_name, "..") == 0))
	{
		pEntry=readdir(pDir);
		if(NULL==pEntry)
		{
			closedir(pDir);
			return;
		}
	}		

	switch(pEntry->d_type)
	{
		case DT_REG:
			if(NULL != filter)
			{
				if(NULL ==strstr(pEntry->d_name,filter))
				{
					break;
				}
			}

			char name[STR_LEN];
			if(0!=strcmp(dirName,"."))
			{
				snprintf(name,STR_LEN,"%s/%s",dirName,pEntry->d_name);
			}
			else
			{
				strncpy(name,pEntry->d_name,STR_LEN);
			}

			if(op)
			{
				op(name,pEntry->d_type);
			}				
			break;
			
		case DT_DIR:	
			if(op)
			{
				op(pEntry->d_name,pEntry->d_type);
			}				
			dir_traverse(pEntry->d_name,filter,op);				
			break;
	}
	
}	
closedir(pDir);

}
static int op_header_files_fun(char name[], int d_type)
{
switch(d_type)
{
case DT_REG:
fprintf(sg_fpHeader,"%s\n",name);
break;
case DT_DIR:
//fprintf(stdout,"@%s\n",name);
break;
}
return 0;
}
static int op_dep_files_fun(char name[], int d_type)
{
switch(d_type)
{
case DT_REG:
//fprintf(stdout,"$@%s\n",name);
parse_dep_file(name);
break;
case DT_DIR:
//fprintf(stdout,"
@%s\n",name);
break;
}
return 0;
}
static int32_t search_depfile(FILE*fp,char name[])
{
char str[STR_LEN];
int32_t result;
fseek(fp,0,SEEK_SET);
while(NULL!=fgets(str,STR_LEN,fp))
{
if(0==strcmp(name,str))
{
return 1;
}
}
return 0;
}

static void generate_filelist(char dname, char hname, char oname)
{
FILE
fpD=fopen(dname,"r");
if(NULL==fpD)
{
fprintf(stderr,"open dep file error!\n");
}

FILE* fpH=fopen(hname,"r");
if(NULL==fpH)
{
	fprintf(stderr,"open dep file error!\n");
}
	
FILE* fpO=fopen(oname,"w+");
if(NULL==fpO)
{
	fprintf(stderr,"open dep file error!\n");
}
	
char str[STR_LEN];
uint32_t line_cnt=0;

while(NULL!=fgets(str,STR_LEN,fpH))
{
	if(!search_depfile(fpD,str))
	{
		fputs(str,fpO);
	}
}

fclose(fpD);
fclose(fpH);
fclose(fpO);

}
static void delete_filelist(char oname)
{
FILE
fp=fopen(oname,"r");
if(NULL==fp)
{
fprintf(stderr,"open dep file error!\n");
}
char str[STR_LEN];

while(NULL!=fgets(str,STR_LEN,fp))
{
	str[strlen(str)-1]=0;
	unlink(str);
}		
fclose(fp);	

}
static int dep_sort_empty(void)
{
int empty=1;
FILE* fp=fopen(FILE_DEPDENCY_SORT,"r");
char str[STR_LEN];
while(NULL!=fgets(str,STR_LEN,fp))
{
if(NULL!=strstr(str,".h"))
{
empty=0;
break;
}
}
fclose(fp);
return empty;
}
int main(int argc, char* argv[])
{
/*
if(argc <2)
{
fprintf(stderr,"%s",USAGE_HELP);
return -1;
}
parse_dep_file(argv[1]);
*/
char cmd[STR_LEN];

//dep files
sg_fpDep=fopen(FILE_DEPDENCY,"w+");
dir_traverse(".",".d",op_dep_files_fun);
fclose(sg_fpDep);
snprintf(cmd,STR_LEN,"sort -u %s | sed -e '/^$/d' >%s",FILE_DEPDENCY,FILE_DEPDENCY_SORT);
system(cmd);
if(dep_sort_empty())
{
fprintf(stderr,"dependency files is absent,please compile at first!\n");
return -2;
}
//header files
sg_fpHeader=fopen(FILE_HEADER,"w+");
dir_traverse(".",".h",op_header_files_fun);
fclose(sg_fpHeader);
snprintf(cmd,STR_LEN,"sort -u %s | sed -e '/^$/d' >%s",FILE_HEADER,FILE_HEADER_SORT);
system(cmd);

//delete files
generate_filelist(FILE_DEPDENCY_SORT,FILE_HEADER_SORT,FILE_TO_DELETED);
delete_filelist(FILE_TO_DELETED);

//clear workaround
unlink(FILE_DEPDENCY);
unlink(FILE_DEPDENCY_SORT);
unlink(FILE_HEADER);
unlink(FILE_HEADER_SORT);
unlink(FILE_TO_DELETED);

return 0;

}

头有点晕,写个博客吧

推荐阅读