Форум программистов, компьютерный форум CyberForum.ru

Как удалить файл только для чтения? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 45, средняя оценка - 4.91
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 13:28     Как удалить файл только для чтения? #1
Пишу функцию поиска файлов в указанной директории:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void Delfil(char temp[], int atrb)
{
    if(atrb)
    {
        int key=0;
        cout<<temp<<" - Только для чтения.  \n1. Удалять? 2. Пропустить? \n";
        cin>>key;
        if(key==1)
            remove(temp);
        else
            cout<<temp<<" - пропущен\n";
    }
    else
    {
        cout<<temp<<" - удален\n";
        remove(temp);
    }
 
}
 
void Scan(char path[], char mask[],int indel)
{
    strcat(path,mask);
    _finddata_t *find=new _finddata_t;
    long done=_findfirst(path,find);
    int result=done;
    while(result!=-1)
    {
            char tempfile[MAX_PATH];
            strcpy(tempfile,path);       //получаем временный путь
            int len=strlen(tempfile);
            tempfile[len-3]='\0';        //удаляем маску в пути
            strcat(tempfile,find->name);     //записываем имя файла к пути
            int atr=find->attrib&_A_RDONLY;      //проверка на только для чтения
            Delfil(tempfile,atr);
            tempfile[0]='\0';
        result=_findnext(done,find);
    }
    _findclose(done);
    delete find;
}
Простые файлы функция удаляет, когда же доходит дело до только для чтения, компилятор переходит в функцию удаления файлов, проходит через строку: remove(temp); и всё равно не удаляет файл, подскажите как быть
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2010, 13:28     Как удалить файл только для чтения?
Посмотрите здесь:

Как открыть файл для чтения в БИНАРНОМ режиме? C++
C++ Как создать член класса только для чтения
C++ Создание файла для записи и чтения, запись в файл данных
Не открывается текстовый файл для чтения (использовал fstream.h) C++
C++ Дан текстовый файл (файл для чтения во вложениях) с упрощённым каталогом выставки собак.
C++ Как задать кодировку при записи в файл или чтения из него
Как передать файл в функцию для записи/чтения (разные функции) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
o-user
245 / 202 / 7
Регистрация: 03.02.2009
Сообщений: 788
19.07.2010, 13:33     Как удалить файл только для чтения? #2
Попробуйте у найденного файла сбрасывать атрибут \"только для чтения\", а потом уже удалять файлы.
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 13:39  [ТС]     Как удалить файл только для чтения? #3
подскажите каким методом сбрасывать атрибут? я этого не знаю

Добавлено через 4 минуты
перефразирую вопрос, как найденному файлу программно установить атрибут только для чтения либо как сбросить?
o-user
245 / 202 / 7
Регистрация: 03.02.2009
Сообщений: 788
19.07.2010, 13:47     Как удалить файл только для чтения? #4
Есть команда
C++
1
_chmode
Это она и есть.
Ее Описание в помощи к С++.
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 13:52  [ТС]     Как удалить файл только для чтения? #5
разве _chmode не относиться только к работе с фтп файлами?
o-user
245 / 202 / 7
Регистрация: 03.02.2009
Сообщений: 788
19.07.2010, 13:57     Как удалить файл только для чтения? #6
Неа... Имено атрибуты локальных файлов.
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 14:00  [ТС]     Как удалить файл только для чтения? #7
хорошо, другой вопрос, если не снять атрибут только для чтения, то файл нельзя удалить?
Почему спрашиваю, мы этого ещё не изучали, но в задании по этой теме стоит цель сделать программу которая удаляет всю директорию, если есть файлы только для чтения то спросить удалить ли их, если удалить то удаляем, а вот _chmode мы не изучали...
o-user
245 / 202 / 7
Регистрация: 03.02.2009
Сообщений: 788
19.07.2010, 14:04     Как удалить файл только для чтения? #8
Вот тут подсказать не смогу... Может что-то упустили при изучении...
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 14:16  [ТС]     Как удалить файл только для чтения? #9
понял, спасибо за ответ буду у препода спрашивать тогда
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9382 / 5432 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
19.07.2010, 16:48     Как удалить файл только для чтения? #10
Вот Вам две функции из WinAPI, надеюсь - пригодятся
GetFileAttributes
SetFileAttributes
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 18:30  [ТС]     Как удалить файл только для чтения? #11
easybudda, WinApi мы будет изучать дальше по теории, сейчас мы изучаем с++, я начинающий программист, спасибо за функции я кое что в них понял, но не пойму как их прикрутить к с++
Т.е. резюмируя все советы которые я получил подводя черту я понял чтоб удалить файл только для чтения необходимо сменить атрибуты файлу, а потом уж его удалять, другого способа нет?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.07.2010, 04:32     Как удалить файл только для чтения? #12
C
1
remove(temp);
попробуй сделать прогу, которая просто удаляет файл для чтения
посмотри, что возвращает remove()
если она не возращает ноль, выполни perror("");
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
30.07.2010, 19:33  [ТС]     Как удалить файл только для чтения? #13
Цитата Сообщение от accept Посмотреть сообщение
посмотри, что возвращает remove()
если она не возращает ноль, выполни perror("");
тема до сих пор актуальна, подскажите кто знает, как мне посмотреть что возращает remove() и какой синтаксис у perror("");
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
30.07.2010, 19:40     Как удалить файл только для чтения? #14
Crudelis,

C
1
2
if(remove(temp)!=0)
   perror("File is not removed");
Или просто
C
1
perror("");
Или же
C
1
 perror("Error");
Синтаксис функции:
C
1
2
#include <stdio.h>
void perror(const char *str);
Функция perror печатает сообщение об ошибке в stderr. В
этом сообщении аргумент string печатается первым, затем печатает-
ся двоеточие, системное сообщение об ошибке для последнего библи-
отечного вызова, выработавшего ошибку, и новая строка. Номер дей-
ствительной ошибки хранится в переменной errno, которая объявлена
на внешнем уровне. Системное сообщение об ошибке доступно через
переменную sys_errlist, которая является массивом сообщений для
счетчика ошибок.
Функция perror печатает приблизительное сообщение об ошиб-
ке, используя значение errno как индекс для sys_errlist. Значение
переменной sys_nerr определяется как максимальное число элементов
в массиве sys_errlist.
Чтобы выработать правильный результат, функция perror долж-
на быть вызвана сразу же после библиотечной процедуры, возвращаю-
щей ошибку. Иначе значение errno может быть перезаписано для
последующих вызовов.
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
31.07.2010, 15:48  [ТС]     Как удалить файл только для чтения? #15
функция perror("File is not removed"); возращает: Permission denied - доступ запрещен
не пойму как дать доступ на удаление файлов только для чтения
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
31.07.2010, 15:53     Как удалить файл только для чтения? #16
Crudelis, Ну значит меняй атрибуты
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
31.07.2010, 15:54  [ТС]     Как удалить файл только для чтения? #17
Lavroff, хм, а как это реализовать программно можно, дело в том что мы не изучали как программно менять атрибуты, а в задании стоит задача удалить файлы только для чтения... во какой запутанный круг
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
31.07.2010, 15:56     Как удалить файл только для чтения? #18
Crudelis, Изучить функции WinAPI или _chmode.
Затем объяснить преподавателю, как работает эта функция.
Думаю прокатит)
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
31.07.2010, 16:04  [ТС]     Как удалить файл только для чтения? #19
Lavroff, спасибо за совет попробую поискать _cmode
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2010, 17:52     Как удалить файл только для чтения?
Еще ссылки по теме:

Как открыть файл одновременно для чтения и для записи? C++
C++ Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
Как создать один файл для чтения и записи одновременно? C++
Не открывается файл для чтения C++
C++ Не может открыть файл для чтения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9382 / 5432 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
31.07.2010, 17:52     Как удалить файл только для чтения? #20
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
#ifndef MAX_PATH
#define MAX_PATH 1024
#endif
    
int main(void){
    char path[MAX_PATH];
    DWORD attr;
    char answ;
    
    printf("File to delete: ");
    if ( scanf("%s%*c", path) != 1 ){
        perror("scanf");
        exit(EXIT_FAILURE);
    }
    
    if ( ( attr = GetFileAttributes(path) ) == INVALID_FILE_ATTRIBUTES ){
        fprintf(stderr, "Can't get attributes for file %s\n", path);
        exit(EXIT_FAILURE);
    }
    
    if ( attr & FILE_ATTRIBUTE_READONLY ) {
        printf("Read only file. Delete anyway? ");
        if ( scanf("%c", &answ) != 1 ){
            perror("scanf");
            exit(EXIT_FAILURE);
        }
        if ( answ != 'y' && answ != 'Y' )
            exit(EXIT_FAILURE);
        attr ^= FILE_ATTRIBUTE_READONLY;
        if ( ! SetFileAttributes(path, attr) ){
            fprintf(stderr, "Can't change attributes for file %s\n", path);
            exit(EXIT_FAILURE);
        }
    }
    
    if ( remove(path) ){
        perror("remove");
        exit(EXIT_FAILURE);
    }
    
    exit(EXIT_SUCCESS);
}
Yandex
Объявления
31.07.2010, 17:52     Как удалить файл только для чтения?
Ответ Создать тему
Опции темы

Текущее время: 12:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru