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

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


reshenie_zadachi_11

Задача 11

Задача 11: Программа для удаления каталогов (удаляются все вложенные папки и файлы). В том случае, если у удаляемого файла (каталога) установлен атрибут Read-Only, необходимо вывести следующее меню: 1. Удалять? 2. Пропустить? 3.Удалять для всех? 4. Отмена?

P.S. Код ниже просто рекурсивно удаляет все вложенные файлы и директории, без запроса на Read-Only

/* 
 * 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);
}
reshenie_zadachi_11.txt · Последние изменения: 2011/01/09 14:53 (внешнее изменение)

Яндекс.Метрика