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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление папки на С 
:(
    Опции темы
szz
  Дата 16.7.2005, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Где тут готовые скрипты валяются? Мне нужна функц, коорая удаляет рекурсивно папку со всем ее содержимым. Функция может использовать только функции из dir.h и stdio.h

Самому лень, чесно говоря, писать (хотя это довольно просто) - я так подумал, что это уже тысячу раз кто-то написал, так почему бы не воспользоваться чьим-то готовым решением?


--------------------
PM   Вверх
LPBOY
Дата 16.7.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Насколько я помню, удалять можно только пустые папки (поправь если ошибаюсь).
Если же папка с файлами, то сначала надо ее очистить, т.е. нужна функция для удаления файлов. В stdio.h, dir.h есть такая функция?
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 16.7.2005, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Вызови system("<здесь в зависимости от твоей операционной системы команда терминала, делающая это.>");
Это самое короткое, что можно придумать.


--------------------
PM MAIL   Вверх
szz
Дата 16.7.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Цитата
Насколько я помню, удалять можно только пустые папки (поправь если ошибаюсь).
Если же папка с файлами, то сначала надо ее очистить, т.е. нужна функция для удаления файлов. В stdio.h, dir.h есть такая функция?

Разумеется только пустые.
Понятно, что есть - надо по всем что внутри рекурсивно побежаться - мне лень ))) Готовую хочу smile

Цитата
Вызови system("<здесь в зависимости от твоей операционной системы команда терминала, делающая это.>");
Это самое короткое, что можно придумать.


Мне переносимое надо. Ладно, если так все - напишу и выложу тут для подобных мне лентяев )))

Это сообщение отредактировал(а) szz - 16.7.2005, 15:44


--------------------
PM   Вверх
LPBOY
Дата 16.7.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Понятно, что есть


И как она называется? Я не нашел.

Это сообщение отредактировал(а) LPBOY - 16.7.2005, 15:57
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 16.7.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Люди !! Вы глухие?? у меня это одна строчка:
Код

system("rm -f -R mydir");

Это в Линуксе. В Винде не так. Вы в командной строке работали?? Вот те команды в system и вставляйте.
И не размножайте мозг себе. smile


--------------------
PM MAIL   Вверх
Mayk
Дата 16.7.2005, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Легче исходник из rm вырвать smile
А почему не делать так: обегаем директорию, удаляя по ходу дела файлы,
полные пути директорий заносим в какой-нить массив, потомо его сортируем qsort'ом(std::sort лучше) так, чтобы в вершине массива содержался самый длинный путь(то есть типа {aaa\aaa\aaa, aaa\aaa, aaa}); потом для каждого элемента массива начиная с первого вызываем remove/rmdir. Рекурсивный проход по папке обсуждался на днях. В качестве предиката для сравнения можно использовать типа того:
Код

int predicate(LHS,RHS){
return LHS.Кол-во-разделителей-директорий - 
     RHS.Кол-во-разделителей-директорий;
}

Добавлено @ 18:46
comcon1
Ты дольше процесс порождать будешь, чем файлы удалять.Не стоит использовать system налево и направо. Он не портируемый. В винде нет rm.

Это сообщение отредактировал(а) Mayk - 16.7.2005, 19:14


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 16.7.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Вот наборосок кота для рекурсивного удаления директории по идеи, описанной выше. Для простоты проверка на ошибки опущена и допускается не более 1024 вложенных папок.
Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

#define directory_separator '/'

const char directory_separator_string[2]={directory_separator, 0};
char* dirs[1024];
int dirs_current=0;


// remove_all_files
// remove all files in directory 'str'
void remove_all_files(char* str)
{
        DIR* d = opendir(str);
        struct dirent* de;
        char* end_of_str = str + strlen(str);
        struct stat st;
        printf("entering %s\n", str);
        dirs[dirs_current++]=strdup(str);


        //for each directory entry
        while((de=readdir(d)) != NULL){
                //skip '.' and '..' entries
                if(de->d_name[0]=='.' &&
                        ((de->d_name[1]==0) ||
                         (de->d_name[1]=='.' && de->d_name[2]==0)))
                        continue;

                //adding directory separator
                strcat(str, directory_separator_string);

                //get full file name
                strcat(str,de->d_name);

                //get file info
                stat(str,&st);
                if(S_ISDIR(st.st_mode))
                        remove_all_files(str);
                else
                        remove(str);
//                      printf("remove(%s);\n",str);
                //truncating file name
                *end_of_str=0;
        }
        closedir(d);
}


void remove_dir(const char* str)
{
        //get buffer for file names
        char* buf = strcpy(malloc(10240),str);
        char* last_char_of_buffer = buf+strlen(buf)-1;
        int i;

        //adding directory separator to the end
        if(*last_char_of_buffer != directory_separator){
                *++last_char_of_buffer=directory_separator;
                *last_char_of_buffer=0;
        }

        remove_all_files(buf);
        for(i = dirs_current-1; i >= 0; --i){
                rmdir(dirs[i]);
                free(dirs[i]);
        }
//              printf("%s\n", dirs[i]);
        free(buf);
}

int main(int argc, char** argv)
{               
        remove_dir("test");                       
}

В топике выше я слегка погорячился с сортировкой, так как директории всё равно будут проходится от самой не вложенной к самой вложенной, поэтому при просмотре директории её имя можно добавлять к архиву, а потом пройти этот архив от конца к началу удаляя директорию в текущем элементе.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
szz
Дата 17.7.2005, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Mayk, ты гений! Спасибо! Прости, что напряг - я и сам мог написать - ленился. Надеюсь, тебе не пришлось это все самому прямо сейчас писать, а ты просто откуда-то стянул - не то мне будет стыдно...

Цитата
И как она называется? Я не нашел.

unlink(char *file_to_delete)
или его макрос - remove(char *file_to_delete)


--------------------
PM   Вверх
Mayk
Дата 17.7.2005, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



szz
Тогда можешь начинать стыдится, потому что я это извлекал из своей памяти - давно что-то подобное писал smile
Кстати, сегодня утром до меня дошло, что заносить в массив директории не стоит - просто добавь в конец remove_all_files строчку rmdir(str);.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
szz
Дата 17.7.2005, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Борланд мне ругнулся на строчку
Код

      char* buf = strcpy(malloc(10240),str);

мол, "cannot convert void* to char*"
исправил на
Код

      char* buf = strcpy((char*)malloc(10240),str);

и все работает. Ты где компилировал, Mayk? В GCC?



--------------------
PM   Вверх
Mayk
Дата 17.7.2005, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Цитата(szz @ 17.7.2005, 20:28)
Ты где компилировал, Mayk? В GCC?

Ага! Именно. Не в g++. В плюсах проверка типов серьёзная. В борле тоже должно получится, если файл как .c сохранить, а не как .cpp.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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