接上回留下的问题,删除那些因参数无法被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);
}