LINUX.ORG.RU

Рекурсивное удаление каталога


0

0

Язык : си
Имеется вложенный каталог
Надо удалить его с помощью rmdir
Т.е. нужен специальный алгоритм , который построит дерево и пробежит его снизу вверх
Есть такое в природе или нужно изобретать велосипед ?

Зы : rm -r не подходит ...

★★★★★

man opendir
man readdir
man 2 stat
man рекурсия

убить_каталог(каталог)
{
 открыть каталог
 по всем файлам(имена)
 {
  если каталог(имя)
   убить_каталог(имя)
  иначе
   unlink(имя)
 }
 закрыть каталог
 rmdir(каталог)
}

generatorglukoff ★★
()
Ответ на: комментарий от kto_tama

(define (rm-r path)
  (if (regular path)
      (rm path)
     (begin (find path rm-r)
            (rmdir path))))

Ща тебе ещё вилфред на перле сообразит наверное.
Ох уж эти сишники...

anonymous
()
Ответ на: комментарий от generatorglukoff

> если (каталог(имя)) { убить_каталог(имя); } иначе { unlink(имя) }

Категорически рекомендуется сделать две вещи:

1. добавить в условие 'имя ne "." && имя ne ".."'

2. вместо реальных вызовов unlink/rmdir поставить printf("unlink(%s)")

anonymous
()
Ответ на: комментарий от anonymous

> Категорически рекомендуется сделать две вещи:

> 1. добавить в условие 'имя ne "." && имя ne ".."'

> 2. вместо реальных вызовов unlink/rmdir поставить printf("unlink(%s)")

да, спасибо, забыл

generatorglukoff ★★
()
Ответ на: комментарий от kto_tama

Вобще еще есть такая штука как "info libc", там описывается функция ftw(), с опциями FTW_DEPTH и FTW_PHYS эта функиця даст нужный результат. Хотя иногда лучше не использовать готовые библиотечные решения...

mky ★★★★★
()
Ответ на: комментарий от generatorglukoff

убить_каталог(каталог)
{
открыть каталог
по всем файлам(имена)
{
если каталог(имя)
убить_каталог(имя)
иначе
unlink(имя)
}
закрыть каталог
rmdir(каталог)
}

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

Deleted
()
Ответ на: комментарий от Deleted

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

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

kto_tama ★★★★★
() автор топика
Ответ на: комментарий от Deleted

> И при развесистой иерархии файловой системы, ты нагребешь кучу открытых дескрипторов каталогов... Вобщем, хреновая практика написания подобных вещей... не энтерпрайз.

что мешает считать сожержимое директории, закрыть её и потом обработать? IMHO каталоги с десятками или сотнями тысяч записей - это скорее редкость, чем правило.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Deleted

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

на каждом уровне вложенности только один дескриптор открывается, т.е. если у тебя 1000 вложенных друг в друга каталогов, то это плохо

generatorglukoff ★★
()
Ответ на: комментарий от kto_tama

Ну если уж пишется действительно что то нужное, то может проще взять исходники команды rm и скопировать соответствующие подпрограммы. Инчае зачем нужен GPL, если не копировать куски исходного текста :).

Потому что если поковыряться в исходых текстах rm, то, например, там есть такое, что lstat() вызывается дважды, до смены каталога и после (на текущий каталог), и сравниваются полученные номера инодов...

mky ★★★★★
()
Ответ на: комментарий от mky

> зачем нужен GPL, если не копировать куски исходного текста

зачем нужен unix если копировать куски исходного текста вместо system("rm -rf ...")

anonymous
()
Ответ на: комментарий от anonymous

> зачем нужен unix если копировать куски исходного текста вместо system("rm -rf ...")

Хватит учить детей анонизму

fmj
()

>пишу консольный файловый менеджер >rm -r не подходит

Не юниксвэй. А вы слуайно не быдлокодер, я извиняюсь?

anonymous
()
Ответ на: комментарий от anonymous

> Не юниксвэй. А вы слуайно не быдлокодер, я извиняюсь?

как раз system("rm -rf") - путь истинного быдла

fmj
()
Ответ на: комментарий от mky

> Ну если уж пишется действительно что то нужное, то может проще взять исходники команды rm и

я так и сделал - выдрал исходники rm из пакета fileutils
работает фантастически быстро , размер вложенного каталога пофиг

kto_tama ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.