Задача 11: Программа для удаления каталогов (удаляются все вложенные папки и файлы). В том случае, если у удаляемого файла (каталога) установлен атрибут Read-Only, необходимо вывести следующее меню: 1. Удалять? 2. Пропустить? 3.Удалять для всех? 4. Отмена?
Код ниже просто рекурсивно удаляет все вложенные файлы и директории, без запроса на Read-Only
Решение с использованием языка CPP:
/* * File: delete.cpp * Author: darkfire * * Created on January 3, 2011, 10:08 PM */ #include <cstdlib> #include <cstring> #include <iostream> #include <io.h> #include <direct.h> #include <sys/stat.h> using namespace std; bool DeleteDir(char DirName[_MAX_PATH]) //DirName нигде не меняем { char DirNameNow[_MAX_PATH]; char FileNameNow[_MAX_PATH]; strcpy(DirNameNow,DirName); //добавим маску поиска и конечный слеш, если не задан if(DirNameNow[strlen(DirNameNow)-1]=='\\') strcat(DirNameNow,"*.*"); else strcat(DirNameNow,"\\*.*"); //char DirNameNext[_MAX_PATH]; _finddata_t *fileinfo = new _finddata_t; long done = _findfirst(DirNameNow, fileinfo);// Начинаем поиск // если done будет равняться -1, то поиск вести бесмысленно int Way = done; while (Way!=-1){ if (fileinfo->attrib & _A_SUBDIR) {// найдена директория if (!((strlen(fileinfo->name)==2)&&strstr(fileinfo->name,"..") ||(strlen(fileinfo->name)==1)&&strchr(fileinfo->name,'.')))// это удалять не надо {//рекурсивный вызов strcpy(DirNameNow,DirName); strcat(DirNameNow,"\\"); strcat(DirNameNow,fileinfo->name); DeleteDir(DirNameNow); //cout<<DirNameNow<<" this dir\n"; if( _rmdir(DirNameNow) != 0 ) perror( "Error directory" ); // удаляем теперь уже пустой директории //_rmdir(DirNameNow); } }else {// найден файл strcpy(FileNameNow,DirName); strcat(FileNameNow,"\\"); strcat(FileNameNow,fileinfo->name); _chmod( FileNameNow, _S_IWRITE ); // сбрасываем атрибуты if( remove(FileNameNow) != 0 ) perror( "Error deleting file" ); } // Пытаемся найти следующий файл из группы Way = _findnext(done, fileinfo); } // Очистка памяти _findclose(done); delete fileinfo; return true; } int main(int argc, char** argv) { char str[_MAX_PATH]; //_MAX_PATH is defined in Stdlib.h as 260 bytes. if(argc==2){ strcpy(str,argv[1]);//скопируем путь в str DeleteDir(str);//функция удаления файлов и вложенных директорий } else{ cout << "Error. No argument.\n"; exit(1); }; return (EXIT_SUCCESS); }