• 遍历文件夹


    使用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 ... "

    "descriptions1
    " 
    "descriptions2
    " 
    "descriptions3 ...
    "
    

    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! ");
    }

    while(NULL!=fgets(str,STR_LEN,fp))
    {
    	char *p;
    	//fprintf(stdout,"line_cnt=%"PRIu32"--------------
    ",line_cnt++);
    	p=strtok(str," ");
    	while(NULL!=p)
    	{
    		if(NULL!=strstr(p,".h"))
    		{
    			fprintf(sg_fpDep,"%s
    ",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!
    ");
    	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 ",name);
    break;
    case DT_DIR:
    //fprintf(stdout,"@%s ",name);
    break;
    }
    return 0;
    }
    static int op_dep_files_fun(char name[], int d_type)
    {
    switch(d_type)
    {
    case DT_REG:
    //fprintf(stdout,"$@%s ",name);
    parse_dep_file(name);
    break;
    case DT_DIR:
    //fprintf(stdout,"
    @%s ",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! ");
    }

    FILE* fpH=fopen(hname,"r");
    if(NULL==fpH)
    {
    	fprintf(stderr,"open dep file error!
    ");
    }
    	
    FILE* fpO=fopen(oname,"w+");
    if(NULL==fpO)
    {
    	fprintf(stderr,"open dep file error!
    ");
    }
    	
    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! ");
    }
    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! ");
    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;
    

    }

    头有点晕,写个博客吧

  • 相关阅读:
    家庭记账本_2
    家庭记账本_1
    安卓学习进度_25
    安卓软件学习进度_24
    对体温上报app的总结
    安卓软件学习进度_23
    安卓软件学习进度_22
    安卓开发
    安卓开发
    安卓开发
  • 原文地址:https://www.cnblogs.com/fedorayang/p/5773696.html
Copyright © 2020-2023  润新知