Здравствуйте! Мне нужно написать программу которая удаляет указанную директорию со всеми её вложениями если таковые имеются. В случаи если в каталоге имеются файлы или папки с меткой "Только чтение" пользователю нужно вывести оповещение и дать возможность либо удалить этот файл (папку) либо пропустить...
Моя программа успешно удаляет директорию если в ней нет файлов только для чтения, если таковые встречаются то удалить их не получается и в следствии не получается удалить и сам каталог.
Подскажите пожалуйста что делать?
вот код:
| Код | #include <iostream> #include <stdio.h> #include <io.h> #include <direct.h> #include <time.h> #include <conio.h> using namespace std; #define WAY_SIZE 512 #define INDEX 1 #define PARAM_COUNT 2 void printWarning(const _finddata_t a,int& answ); void removeFile(const char* fileName); void removeDir(const char* way,const char* wayAndMask); void main(int argc,char* argv[]){ setlocale(LC_ALL,"rus"); if(argc != PARAM_COUNT){ cout<<"Неверное количество параметров"<<endl; return; } char way[WAY_SIZE]; char wayAndMask[WAY_SIZE]; strcpy_s<WAY_SIZE>(way,argv[INDEX]); strcpy_s<WAY_SIZE>(wayAndMask,argv[INDEX]); strcat(wayAndMask,"\\*.*"); removeDir(way,wayAndMask); } void removeFile(const char* fileName){ remove(fileName); } #define DEL 1 #define SKIP 2 #define DEL_ALL 3 #define CANCEL 4 void removeDir(const char* way,const char* wayAndMask){ if(_rmdir(way) == -1){ _finddata_t a; // long keyFind = _findfirst(wayAndMask,&a); // if(keyFind == -1){ cout<<"Папка не найдена!"<<endl; return; } // Скажите пожалуйста это нормально? char _way[WAY_SIZE]; // или это лучше передавать аргументом к функции через ссылку? char _wayAndMask[WAY_SIZE]; // char chek1[]="."; char chek2[]=".."; static int answ=0; if(a.attrib & _A_SUBDIR){ if(strcmp(a.name,chek1) != 0 && strcmp(a.name,chek2) != 0){ cout<<"<dir>"<<a.name<<endl; strcpy_s<WAY_SIZE>(_way,way); strcat(_way,"\\"); strcat(_way,a.name); strcpy_s<WAY_SIZE>(_wayAndMask,_way); strcat(_wayAndMask,"\\*.*"); removeDir(_way,_wayAndMask); } } else{ cout<<a.name<<endl; if(a.attrib & _A_RDONLY && answ!=DEL_ALL){ printWarning(a,answ);
} if(answ == DEL || answ == DEL_ALL){ strcpy(_way,way); strcat(_way,"\\"); strcat(_way,a.name); removeFile(_way); } if(answ == CANCEL){ return; } } while(_findnext(keyFind,&a)!=-1){ if(a.attrib & _A_SUBDIR){ if(stricmp(a.name,chek1) != 0 && stricmp(a.name,chek2) != 0){ cout<<"<dir>"<<a.name<<endl; strcpy_s<WAY_SIZE>(_way,way); strcat(_way,"\\"); strcat(_way,a.name); strcpy_s<WAY_SIZE>(_wayAndMask,_way); strcat(_wayAndMask,"\\*.*"); removeDir(_way,_wayAndMask); } } else{ cout<<a.name<<endl; if(a.attrib & _A_RDONLY && answ!=DEL_ALL){ printWarning(a,answ);
} if(answ == DEL || answ == DEL_ALL || answ == 0){ strcpy(_way,way); strcat(_way,"\\"); strcat(_way,a.name); removeFile(_way); } if(answ == CANCEL){ return; } } } _findclose(keyFind); } _rmdir(way); return; } #define begin 1 #define end 4 void printWarning(const _finddata_t a,int& answ){ cout<<endl; (a.attrib & _A_SUBDIR)?cout<<"Каталог ":cout<<"Файл "; cout<<'"'<<a.name<<'"'<<endl; cout<<"Имеет атрибут \"read only\""<<endl; cout<<"Выберите действие:"<<endl; cout<<"1. Удалить 2. Пропустить 3. Удалить для всех 4. Отмена"<<endl; cout<<endl; do{ cin>>answ; if(answ<begin||answ>end){ cout<<"Ошибка! Повторите ввод!"<<endl; } } while(answ<begin||answ>end); }
|
|