遍历某文件夹并删除一定后缀的文件——@soil@3


接上回留下的问题,删除那些因参数无法被C语言准确获取的文件。

在2中有一个错误就是在我需要的操作中,这些文件里面的特殊符号并不是‘?’,而是ASCII码为3的符号。

因为不能通过vc6++来得到ASCII码在0-31的操作符(问了老师,说是VC对这个进行了保护?屏蔽?)

既然不能准确的删除这些文件,那只能另找出路。

然后我去看了我需要删除的这些文件一般都在一个文件夹里面,然后这个文件夹中的文件都是需要删除的,并且这个文件夹的名称是正常的,这时候我就想到了用remove直接删除文件夹。

错误1:使用remove函数来删除文件夹的时候,并不能完成。查看报错码: permission denied :没有权限。

鉴于现在的水平并不能解决这个问题。那么我又想起来之前翻百度的时候,翻到的一个调用system函数来使用命令行窗口的方法。

一开始永远是傻的无以复加。

直接 del 文件夹名 或者 rd 文件夹

可是del 操作是不能删除目录的。然后 rd 操作也只能删除空目录。

那么因为在这类文件夹中的所有文件都是需要删除的,那我只需要 del *.* 接着 rd 文件夹,就over了。

最后提一句:system函数在操作正确的情况下,是返回 0 的。


附上原码,以供以后翻看,若有错误,欢迎指出,欢迎评价我的不足。

#include 
#include 
#include 
#include 

#define gen "D:\\practice"
#define TRUE					1
#define FALSE					0
#define BIG_FILE_LENGTH			1000
#define NORMAL_FILE_LENGTH		260

void e(int n);
int needDeleteFile(char *fileName);
void deleteAllFile(char *path);
int deleteFile(char *path, char *fileName);
int needDeleteFloder(char *fileName);
int deleteFloder(char *path, char *fileName);

int deleteFloder(char *path, char *fileName){
	char deleteFileName[BIG_FILE_LENGTH] = {0};
	char deleteFloderFile[BIG_FILE_LENGTH] = {0};
	
	sprintf(deleteFileName, "rd %s\\%s", path, fileName);
	sprintf(deleteFloderFile, "del /q %s\\%s\\*.*", path, fileName);

	if(!system(deleteFloderFile)){
		system(deleteFileName);
		printf("delete one floder--->>%s\n", deleteFileName);
	}
	else{
		return FALSE;
	}

	return TRUE;
}

int needDeleteFloder(char *fileName){
	char *tmp[] = {"宣傳文件", "論壇文宣", "JPG", "爱妃"};
	int i;
	
	for(i = 0; i < 4; i++)
		if(!strcmp(tmp[i], fileName)){
			printf("文件夹匹配成功\n");
			return TRUE;
		}

	return FALSE;
}

int deleteFile(char *path, char *fileName){
	char deleteFileName[BIG_FILE_LENGTH] = {0};
	char a[BIG_FILE_LENGTH] = {0};

	sprintf(deleteFileName, "%s\\%s", path, fileName);

	if(!remove(deleteFileName))
		
	//	system(deleteFileName);//会比较慢
		printf("delete one file--->>%s\n", deleteFileName);
	else{
		return FALSE;
	}

	return TRUE;
}

void deleteAllFile(char *path){
	WIN32_FIND_DATA findData;
	HANDLE hFindFile;

	char allPath[NORMAL_FILE_LENGTH];
	char szFileName[NORMAL_FILE_LENGTH];

	sprintf(szFileName, "%s\\*.*", path);

	if((hFindFile = FindFirstFile(szFileName, &findData)) != INVALID_HANDLE_VALUE){
		do{
			if(findData.cFileName[0] == '.')
				continue;
			
			if(!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){//是文件的话
				if(needDeleteFile(findData.cFileName))
					if(!deleteFile(path, findData.cFileName)){
						printf("删除文件失败[error%d:%s]	 %s\n", errno, strerror(errno), findData.cFileName);
					}
			}else{//是文件夹的话				这里使用递归更好
				if(needDeleteFloder(findData.cFileName)){
					deleteFloder(path, findData.cFileName);
				}
			
				sprintf(allPath, "%s\\%s", path, findData.cFileName);
				deleteAllFile(allPath);
			}
		}while(FindNextFile(hFindFile, &findData));
	}else
		printf("error--->>:%s\n", strerror(errno));

	FindClose(hFindFile);
}

int needDeleteFile(char *fileName){
	char *t[] = {"url", "txt", "jpg", "gif", "chm", "mht", "rar", "png", "zip", "exe"};
	int len;
	char p[4] = {0};
	int i;

	len = strlen(fileName);
	for(i = 0; i < 3; i++)
		p[i] = fileName[len+i-3];
	for(i = 0; i < 10; i++)
		if(!strcmp(p, t[i])){//需要删除文件
			return 1;
		}

	return 0;
}

void e(int n){
	printf("error == %d\n", n);
}

void main(void){
	char szFileName[BIG_FILE_LENGTH] = gen;
	//这个也是错的~~char *szFileName = gen;
	//错误:char szFileName[] = gen;
	deleteAllFile(szFileName);
}


你可能感兴趣的:(遍历某文件夹并删除一定后缀的文件——@soil@3)