Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/47: Рейтинг темы: голосов - 47, средняя оценка - 5.00
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
1

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

19.07.2010, 13:28. Показов 8427. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу функцию поиска файлов в указанной директории:

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); и всё равно не удаляет файл, подскажите как быть
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2010, 13:28
Ответы с готовыми решениями:

Как создать член класса только для чтения
Хочу создать член класса только для чтения. Можно, конечно, поместить член в раздел private и...

Как открыть файл одновременно для чтения и для записи?
Делаю вот так, но ничего не получается.:( std::fstream inOutCredit(&quot;credit.dat&quot;, std::ios::ate |...

Как открыть файл для чтения в БИНАРНОМ режиме?
Друзья! Файл, который надо открыть БИНАРНЫЙ, в нём два байта. Содержание файла 33 20 00 00 имя...

Как создать один файл для чтения и записи одновременно?
Пробовал перезапись, но содержимое файла терялось while (file1.hasNext()) { ...

19
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
19.07.2010, 13:33 2
Попробуйте у найденного файла сбрасывать атрибут \"только для чтения\", а потом уже удалять файлы.
0
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 13:39  [ТС] 3
подскажите каким методом сбрасывать атрибут? я этого не знаю

Добавлено через 4 минуты
перефразирую вопрос, как найденному файлу программно установить атрибут только для чтения либо как сбросить?
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
19.07.2010, 13:47 4
Есть команда
C++
1
_chmode
Это она и есть.
Ее Описание в помощи к С++.
1
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 13:52  [ТС] 5
разве _chmode не относиться только к работе с фтп файлами?
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
19.07.2010, 13:57 6
Неа... Имено атрибуты локальных файлов.
0
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 14:00  [ТС] 7
хорошо, другой вопрос, если не снять атрибут только для чтения, то файл нельзя удалить?
Почему спрашиваю, мы этого ещё не изучали, но в задании по этой теме стоит цель сделать программу которая удаляет всю директорию, если есть файлы только для чтения то спросить удалить ли их, если удалить то удаляем, а вот _chmode мы не изучали...
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
19.07.2010, 14:04 8
Вот тут подсказать не смогу... Может что-то упустили при изучении...
0
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 14:16  [ТС] 9
понял, спасибо за ответ буду у препода спрашивать тогда
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
19.07.2010, 16:48 10
Вот Вам две функции из WinAPI, надеюсь - пригодятся
GetFileAttributes
SetFileAttributes
1
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
19.07.2010, 18:30  [ТС] 11
easybudda, WinApi мы будет изучать дальше по теории, сейчас мы изучаем с++, я начинающий программист, спасибо за функции я кое что в них понял, но не пойму как их прикрутить к с++
Т.е. резюмируя все советы которые я получил подводя черту я понял чтоб удалить файл только для чтения необходимо сменить атрибуты файлу, а потом уж его удалять, другого способа нет?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.07.2010, 04:32 12
C
1
remove(temp);
попробуй сделать прогу, которая просто удаляет файл для чтения
посмотри, что возвращает remove()
если она не возращает ноль, выполни perror("");
0
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
30.07.2010, 19:33  [ТС] 13
Цитата Сообщение от accept Посмотреть сообщение
посмотри, что возвращает remove()
если она не возращает ноль, выполни perror("");
тема до сих пор актуальна, подскажите кто знает, как мне посмотреть что возращает remove() и какой синтаксис у perror("");
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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 может быть перезаписано для
последующих вызовов.
1
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
31.07.2010, 15:48  [ТС] 15
функция perror("File is not removed"); возращает: Permission denied - доступ запрещен
не пойму как дать доступ на удаление файлов только для чтения
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.07.2010, 15:53 16
Crudelis, Ну значит меняй атрибуты
0
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
31.07.2010, 15:54  [ТС] 17
Lavroff, хм, а как это реализовать программно можно, дело в том что мы не изучали как программно менять атрибуты, а в задании стоит задача удалить файлы только для чтения... во какой запутанный круг
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.07.2010, 15:56 18
Crudelis, Изучить функции WinAPI или _chmode.
Затем объяснить преподавателю, как работает эта функция.
Думаю прокатит)
0
Шаровик затейник
696 / 445 / 78
Регистрация: 06.05.2010
Сообщений: 1,109
31.07.2010, 16:04  [ТС] 19
Lavroff, спасибо за совет попробую поискать _cmode
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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);
}
3
31.07.2010, 17:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2010, 17:52
Помогаю со студенческими работами здесь

Как передать файл в функцию для записи/чтения (разные функции)
Собственно сабж. Во первых есть вот такой блок в main: ofstream f1(&quot;F1.txt&quot;); cout&lt;&lt;&quot;Введите...

Дан текстовый файл (файл для чтения во вложениях) с упрощённым каталогом выставки собак.
ЗАДАНИЕ ПО ЭКЗАМЕНУ ПО ПРОГРАММИРОВАНИЮ НА ЯЗЫКЕ С++ (можно писать и на С. не запрещается) Всё по...

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

Не может открыть файл для чтения
Почему-то после закрытия не открывается файл F2? На последнем шаге программы(99 строка) срабатывает...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru