/* 操作方法: 在生成的可执行程序(test.exe)目录下编写一个bat文件 例如a.bat 内容: test.exe .bmp 则删除当前目录下包含在目录的所有.bmp的文件 */ #include <stdio.h> #include <string.h> // strncpy #include <stdlib.h> // tolower #include <io.h> // struct _finddata_t #include "direct.h" // _chdir //#define EXT_EXE_NAME (const char *)".ex1" // #define EXT_EXE_NAME (const char *)".exe" #define EXT_OBJ_NAME (const char *)".bm1" //#define EXT_OBJ_NAME (const char *)".obj" #define EXT_PROMAT (const char )'.' #define MAX_EXT_NAME_LEN (int)4 #define MAX_FILE_PATH_LEN (int)256 #define TERR -1 #define TOK 0 char EXT_EXE_NAME[MAX_EXT_NAME_LEN+1] = {0}; /*========================================================================== 函 数 名 : IsValidExtName 功 能 : 判断文件的扩展名是否为需要的,即为有效? 目前支持的扩展名长度仅为4,如.exe,.bat,.bmp... 算法实现 : 无 参 数 : [in] const char *lpcstrName - 文件名,全路径 [in] int nLen - 文件名长度 返 回 值 : 有效返回TOK,无效返回TERR 作 者 : jernymy 日 期 : 20100415 ==========================================================================*/ static int IsValidExtName(const char *lpcstrName, int nLen) { char chData[MAX_EXT_NAME_LEN+1] = {0}; if (NULL == lpcstrName) { printf("NULL == lpcstrName/n"); return TERR; } if (nLen <= MAX_EXT_NAME_LEN) { printf("nLen:%d <= MAX_EXT_NAME_LEN:%d/n", nLen, MAX_EXT_NAME_LEN); return TERR; } strncpy(chData, lpcstrName+(nLen-MAX_EXT_NAME_LEN), MAX_EXT_NAME_LEN); if ( (0 == strncmp(chData, EXT_EXE_NAME, MAX_EXT_NAME_LEN))) // || (0 == strncmp(chData, EXT_OBJ_NAME, MAX_EXT_NAME_LEN))) { return TOK; } return TERR; } static void SearchFile(void); /*========================================================================== 函 数 名 : ProcessFile 功 能 : 处理文件或者目录 如果是文件则同时是对应扩展名的文件,则删除 如果是目录同时不是"."或者"..",则进入目录并递归调用 算法实现 : 无 参 数 : [in] struct _finddata_t tFile - 传入结构体信息 返 回 值 : 无 作 者 : jernymy 日 期 : 20100415 ==========================================================================*/ static void ProcessFile(struct _finddata_t tFile) { char chFilePath[MAX_FILE_PATH_LEN]; int nIdx; int nLen; if (tFile.attrib & _A_SUBDIR) { // 是目录 if (tFile.name[0] != '.') // '.', '..'这两个目录为不操作的目录 { _chdir(tFile.name); // 改变工作目录为搜索到的目录-进入该目录 _getcwd(chFilePath, MAX_FILE_PATH_LEN); // 得到当前目录的绝对路径 SearchFile(); // 递归的搜索 _chdir(".."); // 退回到上级目录 } } else { // 是文件 _getcwd(chFilePath, MAX_FILE_PATH_LEN); nLen = strlen(tFile.name); for (nIdx = 0; nIdx < nLen; nIdx++) { tFile.name[nIdx] = tolower(tFile.name[nIdx]); // 把字符转换成小写字母,非字母字符不做出处理 } if (TERR == IsValidExtName(tFile.name, nLen)) { return; } strcat(chFilePath, "//"); strcat(chFilePath, tFile.name); puts(chFilePath); // 输出搜索到的文件 if (-1 == unlink(chFilePath)) // 删除搜索到的文件 { // 失败 printf("%s :%d: can not delete the file: %s/n", __FILE__, __LINE__, chFilePath); } } } /*========================================================================== 函 数 名 : SearchFile 功 能 : 遍历所有的文件和目录 算法实现 : 无 参 数 : 无 返 回 值 : 无 作 者 : jernymy 日 期 : 20100415 ==========================================================================*/ static void SearchFile(void) { int nFHandle; struct _finddata_t tFile; nFHandle = _findfirst("*", &tFile); if (-1 == nFHandle) { return; } else { ProcessFile(tFile); } while (0 == _findnext(nFHandle, &tFile)) { ProcessFile(tFile); } _findclose(nFHandle); return; } int main(int argc, char **argv) { if (argc < 2) // no input parameter { printf("input parameter is too short, must 2 parameter/n"); return -1; } strncpy(EXT_EXE_NAME, argv[1], MAX_EXT_NAME_LEN); printf("now delete ext:%s/n", EXT_EXE_NAME); SearchFile(); getchar(); return 0; }