| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Удаление папки на С |
| Автор: szz 16.7.2005, 13:08 |
| Где тут готовые скрипты валяются? Мне нужна функц, коорая удаляет рекурсивно папку со всем ее содержимым. Функция может использовать только функции из dir.h и stdio.h Самому лень, чесно говоря, писать (хотя это довольно просто) - я так подумал, что это уже тысячу раз кто-то написал, так почему бы не воспользоваться чьим-то готовым решением? |
| Автор: LPBOY 16.7.2005, 14:14 |
| Насколько я помню, удалять можно только пустые папки (поправь если ошибаюсь). Если же папка с файлами, то сначала надо ее очистить, т.е. нужна функция для удаления файлов. В stdio.h, dir.h есть такая функция? |
| Автор: comcon1 16.7.2005, 14:38 |
| Вызови system("<здесь в зависимости от твоей операционной системы команда терминала, делающая это.>"); Это самое короткое, что можно придумать. |
| Автор: szz 16.7.2005, 15:43 | ||||
Разумеется только пустые. Понятно, что есть - надо по всем что внутри рекурсивно побежаться - мне лень ))) Готовую хочу
Мне переносимое надо. Ладно, если так все - напишу и выложу тут для подобных мне лентяев ))) |
| Автор: LPBOY 16.7.2005, 15:49 | ||
И как она называется? Я не нашел. |
| Автор: comcon1 16.7.2005, 15:59 | ||
Люди !! Вы глухие?? у меня это одна строчка:
Это в Линуксе. В Винде не так. Вы в командной строке работали?? Вот те команды в system и вставляйте. И не размножайте мозг себе. |
| Автор: Mayk 16.7.2005, 18:44 | ||
| Легче исходник из rm вырвать А почему не делать так: обегаем директорию, удаляя по ходу дела файлы, полные пути директорий заносим в какой-нить массив, потомо его сортируем qsort'ом(std::sort лучше) так, чтобы в вершине массива содержался самый длинный путь(то есть типа {aaa\aaa\aaa, aaa\aaa, aaa}); потом для каждого элемента массива начиная с первого вызываем remove/rmdir. Рекурсивный проход по папке обсуждался на днях. В качестве предиката для сравнения можно использовать типа того:
Добавлено @ 18:46 comcon1 Ты дольше процесс порождать будешь, чем файлы удалять.Не стоит использовать system налево и направо. Он не портируемый. В винде нет rm. |
| Автор: Mayk 16.7.2005, 19:42 | ||
Вот наборосок кота для рекурсивного удаления директории по идеи, описанной выше. Для простоты проверка на ошибки опущена и допускается не более 1024 вложенных папок.
В топике выше я слегка погорячился с сортировкой, так как директории всё равно будут проходится от самой не вложенной к самой вложенной, поэтому при просмотре директории её имя можно добавлять к архиву, а потом пройти этот архив от конца к началу удаляя директорию в текущем элементе. |
| Автор: szz 17.7.2005, 02:55 | ||
Mayk, ты гений! Спасибо! Прости, что напряг - я и сам мог написать - ленился. Надеюсь, тебе не пришлось это все самому прямо сейчас писать, а ты просто откуда-то стянул - не то мне будет стыдно...
unlink(char *file_to_delete) или его макрос - remove(char *file_to_delete) |
| Автор: Mayk 17.7.2005, 08:52 |
| szz Тогда можешь начинать стыдится, потому что я это извлекал из своей памяти - давно что-то подобное писал Кстати, сегодня утром до меня дошло, что заносить в массив директории не стоит - просто добавь в конец remove_all_files строчку rmdir(str);. |
| Автор: szz 17.7.2005, 19:28 | ||||
Борланд мне ругнулся на строчку
мол, "cannot convert void* to char*" исправил на
и все работает. Ты где компилировал, Mayk? В GCC? |
| Автор: Mayk 17.7.2005, 19:32 | ||
Ага! Именно. Не в g++. В плюсах проверка типов серьёзная. В борле тоже должно получится, если файл как .c сохранить, а не как .cpp. |