Инструменты пользователя

Инструменты сайта


reshenie_zadachi_11

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

reshenie_zadachi_11 [2011/01/09 17:53]
reshenie_zadachi_11 [2020/06/13 13:46] (текущий)
Строка 1: Строка 1:
 +====== Задача 11 ======
 +**Задача 11:** Программа для удаления каталогов (удаляются все вложенные папки и файлы). В том случае, если у удаляемого файла (каталога) установлен атрибут Read-Only, необходимо вывести следующее меню: 1. Удалять? 2. Пропустить? 3.Удалять для всех? 4. Отмена?
  
 +P.S. Код ниже просто рекурсивно удаляет все вложенные файлы и директории, без запроса на Read-Only
 +<file>
 +/* 
 + * 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);
 +}
 +</file>