// count-lines.c 2011-10-26 Hatada // 指定ディレクトリを再帰探索し、拡張子別にファイル数, 行数, サイズを求める // count-lines c:/mh/www #include #include #include typedef struct _SIZE { int files; int lines; int size; } SIZE; typedef struct _finddata_t finddata_t; char *ext[] = { "html", "c", "h", "java", "js", "js.html", "css", "bat" }; #define nExt 8 SIZE size[nExt]; int countLines(char* filename) { char buf[256]; int lines = 0; FILE* fp = fopen(filename, "r"); while (fgets(buf, sizeof(buf), fp) != NULL) { lines++; } fclose(fp); return lines; } void scan(char *dir) { finddata_t fdata; int fh; int n, lines; char path[260], *pExt; sprintf(path, "%s/*.*", dir); if ((fh = _findfirst(path, &fdata)) == -1) { return; } do { sprintf(path, "%s/%s", dir, fdata.name); if (fdata.attrib & _A_SUBDIR) { if (strcmp(fdata.name, ".") != 0 && strcmp(fdata.name, "..") != 0) { scan(path); } // カレントディレクトリと親ディレクトリは除外する } else if (fdata.size > 0) { pExt = strchr(fdata.name, '.'); // 拡張子 if (pExt != NULL) { for (n = 0; n < nExt; n++) { if (strcmp(ext[n], pExt+1) == 0) break; } if (n < nExt) { lines = countLines(path); // printf("%d\t%s\t%s\n", lines, pExt, path); size[n].files++; size[n].lines += lines; size[n].size += fdata.size; } } } } while (_findnext(fh, &fdata) == 0); _findclose(fh); } int main(int argc, char* argv[]) { int n, sumFiles=0, sumLines=0, sumSize=0; scan(argv[1]); printf("拡張子,ファイル数, 行 数 , サイズ\n"); for (n = 0; n < nExt; n++) { sumFiles += size[n].files; sumLines += size[n].lines; sumSize += size[n].size; printf("%s,%d,%d,%d\n", ext[n], size[n].files, size[n].lines, size[n].size); } printf("合計,%d,%d,%d\n", sumFiles, sumLines, sumSize); }