您的位置:首页 > 其它

删除当前目录下包含在目录的所有.的扩展名的文件

2010-04-15 15:24 447 查看
/*
操作方法: 在生成的可执行程序(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐