zoukankan      html  css  js  c++  java
  • 遍历文件夹

    使用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;
    

    }

    头有点晕,写个博客吧

  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/fedorayang/p/5773696.html
Copyright © 2011-2022 走看看