zoukankan      html  css  js  c++  java
  • tool: count line count of files in a folder

    #include <stdio.h>
    #include <windows.h>
    //#include <hash_map>
    //#include <string>

    char line[10000];
    FILE *fpW = 0;        //count line
    FILE *fpW_Date = 0;        //for srch file within some date
    long gnchar=0,gnline=0;
    int hours_before = 0;
    char destFolder[MAX_PATH]={0};
    //std::hash_map<std::string> exts;
    char *exts[] = {"h", "hpp","c","cpp"
    };
    int nExt = 4;

    void count(const char *file, long &nchar, long &nline)
    {
        nchar = 0;
        nline = 0;
        FILE *fp = fopen(file, "r");
        if(fp)
        {
            for(char *p = fgets(line, 10000, fp); p; p = fgets(line, 10000, fp))
            {
                nline++;
                nchar += strlen(p);
            }
            
            fclose(fp);
        }
    }

    inline bool isExt(const char *file)
    {
        const char *ext = strrchr(file, '.');
        if(!ext)
            return false;
        ext++;
        for(int i=0; i<nExt; i++)
        {
            if(stricmp(ext, exts[i])==0)
                return true;
        }
        
        return false;
    }

    float seconds_between(const FILETIME & from, const FILETIME & to)
    {
        enum {
           TICKS_PER_DAY = 10000000,
        };
       return float((*(__int64 *) & to) - (*(__int64 *) & from)) / TICKS_PER_DAY;
    }

    void getFileList(const char *folder, long &fnchar, long &fnline)
    {
        WIN32_FIND_DATA stFindData;
        long nchar, nline;
        char sFull[MAX_PATH];
        
        sprintf(sFull, "%s\\*", folder);
        HANDLE Handle = FindFirstFile(sFull, &stFindData);
        
        if(Handle == INVALID_HANDLE_VALUE)return;
        FindNextFile(Handle, &stFindData);
        while (FindNextFile(Handle, &stFindData))
        {
            sprintf(sFull, "%s\\%s", folder, stFindData.cFileName);
                
            if(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    //folder
            {
                printf("%s\n",sFull);
                long subfnchar=0, subfnline=0;
                getFileList(sFull, subfnchar, subfnline);
                fnchar += subfnchar;
                fnline += subfnline;
            }
            else    //file
            {
                if(isExt(stFindData.cFileName))
                {
                    count(sFull, nchar, nline);
                    fprintf(fpW, "<tr><td>%s<td>%d<td>%d</tr>\n", sFull, nchar, nline);
                    gnchar += nchar;
                    gnline += nline;
                    fnchar += nchar;
                    fnline += nline;
                    
                    //SYSTEMTIME stUTC;
                    //FileTimeToSystemTime( stFindData.ftLastWriteTime, &stUTC );
                    
                    if(hours_before)
                    {
                        FILETIME stNow;
                        GetSystemTimeAsFileTime(&stNow);
                        float diff_second = seconds_between(stFindData.ftLastWriteTime,stNow);
                        if(diff_second>hours_before*24*60*60)    //check date
                            fprintf(fpW_Date, "%s\n", sFull);
                    }
                    
                }
            }
        }
        
        FindClose(Handle);
        
        fprintf(fpW, "<tr><td><font color=red>%s</font> <td><font color=red>%d</font> <td><font color=red>%d</font> </tr>\n", folder, fnchar, fnline);
    }

    void main(int argc, char *argv[])
    {
        bool succeed = false;
        
        if(argc>=2)
        {
            //parse arguments
            
            for(int i=1; i<argc; i++)
            {
                if(argv[i][0]=='-')
                {
                    if(argv[i][1]=='t')
                    {
                        sscanf(argv[i+1], "%d", &hours_before);
                    }
                    else if(argv[i][1]=='c')
                    {
                        strcpy(destFolder, argv[i+1]);
                    }
                }
            }
            
            printf("parse result, hours_before %d, destFolder %s\n", hours_before, destFolder);
            
            
            long fnchar=0, fnline=0;
            
            char destfile[300];
            sprintf(destfile, "%s\\lineCnt.htm", argv[1]);
            fpW = fopen(destfile, "w");
            
            sprintf(destfile, "%s\\DateCnt.txt", argv[1]);
            fpW_Date = fopen(destfile, "w");
            
            fprintf(fpW, "<table>\n");
            getFileList(argv[1],fnchar,fnline);
            fprintf(fpW, "<tr><td>%s<td>%d<td>%d</tr>\n", "Total", gnchar, gnline);
            fprintf(fpW, "</table>\n");
            
            fclose(fpW);
            fclose(fpW_Date);
        }
        
        if(!succeed)
        {
            printf("Usage:\n");
            printf("lineCnt [-t <hours before>] [-copyto <folder>] <folder>\n");
        }
    }
  • 相关阅读:
    C# RabbitMQ
    使用HttpClient和WebRequest时POST一个对象的写法
    HTTP中application/x-www-form-urlencoded字符说明
    MVC5 Entity Framework学习
    SQL Server安全
    Entity Framework查询
    COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。最新解决方案
    js中精度问题以及解决方案
    string.format
    t-sql对被除数为0&除数小于被除数结果为0&除法保留2位小数的处理
  • 原文地址:https://www.cnblogs.com/cutepig/p/1956928.html
Copyright © 2011-2022 走看看