Удаление каталога вместе с содержимым
Проблема
Требуется рекурсивно удалить ветвь дерева каталога без применения rm - r.
Решение
Воспользуйтесь функцией finddepth модуля File::Find
#!/usr/bin/perl
# rmtree1 - удаление ветви дерева каталогов
use File::Find qw(finddepth);
die "usage: $0 dir ..\n" unless @ARGV;
*name = *File::Find::name;
finddepth \&zap, @ARGV;
sub zap {
if (!-l && -d _) {
print "rmdir $name\n";
rmdir($name) or warn "couldn't rmdir $name: $!";
} else {
print "unlink $name";
unlink($name) or warn "couldn't unlink $name: $!";
}
}
Или воспользуйтесь функцией rmtree модуля File::Path
#!/usr/bin/perl
# rmtree2 - удаление ветви дерева каталогов
use File::Path;
die "usage: $0 dir ..\n" unless @ARGV;
foreach $dir (@ARGV) {
rmtree($dir);
}
Комментарий
Модуль File::Find экспортирует функцию find, которая перебирает содержимое каталога
практически в случайном порядке следования файлов, и функцию finddepth, гарантирующую
перебор всех внутренних файлов перед посещением самого каталога. Именно этот вариант
поведения использован нами для удаления каталога вместе с содержимым.
У нас есть две функции, rmdir и unlink. Функция unlink удаляет только файлы, a rmdir —
только пустые каталоги. Мы должны использовать finddepth, чтобы содержимое каталога
заведомо удалялось раньше самого каталога.
Перед тем как проверять, является ли файл каталогом, необходимо узнать, не является ли он
символической ссылкой. -d возвращает true и для каталога, и для символической ссылки на
каталог. Функции
stat,
lstat
и операторы проверки (типа -d) используют системную функцию
stat(2), которая возвращает всю информацию о файле, хранящуюся в индексном узле. Эти
функции и операторы сохраняют полученную информацию и позволяют выполнить дополнительные
проверки того же файла с помощью специального манипулятора _. При этом удается избежать
лишних вызовов системных функций, возвращающих старую информацию и замедляющих работу программы.
См. такжеОписание функций
unink,
rmdir,
lstat и
stat
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|