Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление read onlye файлов 
:(
    Опции темы
heforma
Дата 9.2.2012, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



Здравствуйте!
Мне нужно написать программу которая удаляет указанную директорию со всеми её вложениями если таковые имеются.
В случаи если в каталоге имеются файлы или папки с меткой "Только чтение" пользователю нужно вывести оповещение и дать возможность либо удалить этот файл (папку) либо пропустить...

Моя программа успешно удаляет директорию если в ней нет файлов только для чтения, если таковые встречаются то удалить их не получается и в следствии не получается удалить и сам каталог.

Подскажите пожалуйста что делать?

вот код:

Код

#include <iostream>
#include <stdio.h>
#include <io.h>
#include <direct.h>
#include <time.h>
#include <conio.h>
using namespace std;
#define WAY_SIZE 512
#define INDEX 1
#define PARAM_COUNT 2
void printWarning(const _finddata_t a,int& answ);
void removeFile(const char* fileName);
void removeDir(const char* way,const char* wayAndMask);
void main(int argc,char* argv[]){
    setlocale(LC_ALL,"rus");
    if(argc != PARAM_COUNT){
        cout<<"Неверное количество параметров"<<endl;
        return;
    }
    char way[WAY_SIZE];
    char wayAndMask[WAY_SIZE];
    strcpy_s<WAY_SIZE>(way,argv[INDEX]);
    strcpy_s<WAY_SIZE>(wayAndMask,argv[INDEX]);
    strcat(wayAndMask,"\\*.*");
    removeDir(way,wayAndMask);
}
void removeFile(const char* fileName){
    remove(fileName);
}
#define DEL 1
#define SKIP 2
#define DEL_ALL 3
#define CANCEL 4
void removeDir(const char* way,const char* wayAndMask){
    if(_rmdir(way) == -1){
        _finddata_t a;                                //
        long keyFind = _findfirst(wayAndMask,&a);    //
        if(keyFind == -1){
            cout<<"Папка не найдена!"<<endl;
            return;
        }                                            // Скажите пожалуйста это нормально?
        char _way[WAY_SIZE];                        // или это лучше передавать аргументом к функции через ссылку?
        char _wayAndMask[WAY_SIZE];                    //
        char chek1[]=".";
        char chek2[]="..";
        static int answ=0;
        if(a.attrib & _A_SUBDIR){
            if(strcmp(a.name,chek1) != 0 && strcmp(a.name,chek2) != 0){
                cout<<"<dir>"<<a.name<<endl;
                strcpy_s<WAY_SIZE>(_way,way);
                strcat(_way,"\\");
                strcat(_way,a.name);
                strcpy_s<WAY_SIZE>(_wayAndMask,_way);
                strcat(_wayAndMask,"\\*.*");
                removeDir(_way,_wayAndMask);
            }
        }
        else{
            cout<<a.name<<endl;
            if(a.attrib & _A_RDONLY && answ!=DEL_ALL){
                printWarning(a,answ);

            }
            if(answ == DEL || answ == DEL_ALL){
            strcpy(_way,way);
            strcat(_way,"\\");
            strcat(_way,a.name);
            removeFile(_way);
            }
            if(answ == CANCEL){
                return;
            }
        }
        while(_findnext(keyFind,&a)!=-1){
            if(a.attrib & _A_SUBDIR){
                if(stricmp(a.name,chek1) != 0 && stricmp(a.name,chek2) != 0){
                    cout<<"<dir>"<<a.name<<endl;
                    strcpy_s<WAY_SIZE>(_way,way);
                    strcat(_way,"\\");
                    strcat(_way,a.name);
                    strcpy_s<WAY_SIZE>(_wayAndMask,_way);
                    strcat(_wayAndMask,"\\*.*");
                    removeDir(_way,_wayAndMask);
                }
            }
            else{
                cout<<a.name<<endl;
                if(a.attrib & _A_RDONLY && answ!=DEL_ALL){
                    printWarning(a,answ);

                }
                if(answ == DEL || answ == DEL_ALL || answ == 0){
                    strcpy(_way,way);
                    strcat(_way,"\\");
                    strcat(_way,a.name);
                    removeFile(_way);
                }
                if(answ == CANCEL){
                    return;
                }
            }
        }
        _findclose(keyFind);
    }
    _rmdir(way);
    return;
}
#define begin 1
#define end 4
void printWarning(const _finddata_t a,int& answ){
    cout<<endl;
    (a.attrib & _A_SUBDIR)?cout<<"Каталог ":cout<<"Файл ";
    cout<<'"'<<a.name<<'"'<<endl;
    cout<<"Имеет атрибут \"read only\""<<endl;
    cout<<"Выберите действие:"<<endl;
    cout<<"1. Удалить 2. Пропустить 3. Удалить для всех 4. Отмена"<<endl;
    cout<<endl;
    do{
        cin>>answ;
        if(answ<begin||answ>end){
            cout<<"Ошибка! Повторите ввод!"<<endl;
        }
    }
    while(answ<begin||answ>end);
}
 
PM MAIL   Вверх
xvr
Дата 9.2.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Прочесть атрибуты файла, проверить, что стоит RO, поменять атрибуты (снять RO), удалять

PM MAIL   Вверх
heforma
Дата 9.2.2012, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



А с помощью чего можно изменить атрибут?

Это сообщение отредактировал(а) heforma - 9.2.2012, 16:49
PM MAIL   Вверх
bsa
Дата 9.2.2012, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



heforma, это платформозависимые функции.
PM   Вверх
heforma
Дата 9.2.2012, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



Для windows подскажите... если имеет значение релиз... тогда для 7ки и ХР
PM MAIL   Вверх
feodorv
Дата 9.2.2012, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(heforma @  9.2.2012,  19:23 Найти цитируемый пост)
Для windows подскажите... если имеет значение релиз... тогда для 7ки и ХР 


Кусок кода:
Код

{
  DWORD attrs;

  if( (attrs = GetFileAttributes( fileName )) == INVALID_FILE_ATTRIBUTES )
  {
    if( GetLastError() == ERROR_FILE_NOT_FOUND ||
        GetLastError() == ERROR_PATH_NOT_FOUND ) return TRUE;
    ...
    return FALSE;
  }

  if( (attrs & FILE_ATTRIBUTE_DIRECTORY) != 0 )
  {
   . ..
    return FALSE;
  }

  if( (attrs & FILE_ATTRIBUTE_READONLY) != 0 )
    if( !SetFileAttributes( fileName, (attrs & ~FILE_ATTRIBUTE_READONLY)) )
    {
       ...
       return FALSE;
    }


  if( !DeleteFile( fileName ) )
  {
    ...
    return FALSE;
  }

  return TRUE;
}


Это сообщение отредактировал(а) feodorv - 9.2.2012, 20:53


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0782 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.