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

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


reshenie_zadachi_11

Различия

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

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

reshenie_zadachi_11 [2011/01/09 09:53] (текущий)
Строка 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>​
загрузка...
reshenie_zadachi_11.txt · Последние изменения: 2011/01/09 09:53 (внешнее изменение)