Задача 11: Написать программу для удаления вложенных каталогов и файлов

Задачи Олимпиады для языка C

Задача 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);
}