Удаление файлов

Файлы обычно создаются для хранения данных. Однако со временем данные устаревают и файл приходится удалять из системы. На уровне командного процессора UNIX удаление файла или файлов выполняется командой rm:

$ rm slate bedrock lava
В Perl для этой цели используется оператор unlink:
unlink "slate", "bedrock", "lava";

Три файла с заданными именами бесследно исчезают из системы. Так как функция unlink получает список, а функция glob возвращает список, эти две функции можно объединить для удаления множества файлов по маске:

unlink glob "*.o";

Результат аналогичен выполнению команды rm *.o в командном процессоре, если не считать того, что нам не пришлось порождать отдельный процесс rm. Теперь ваши файлы с важными данными будут уничтожаться гораздо быстрее! Возвращаемое значение unlinkсообщает количество успешно удаленных файлов. Возвращаясь к первому примеру, мы можем проверить, успешно ли прошло удаление:

my $successful = unlink "slate", "bedrock", "lava";
print "I deleted $successful file(s) just now\n";

Конечно, если результат равен 3, мы знаем, что все файлы были удалены, а если 0 – то ни один файл не был удален.


А если функция возвращает 1 или 2? По этому значению невозможно определить, какие файлы были удалены. Если вас интересует эта информация, удаляйте файлы по одному в цикле:

foreach my $file (qw(slate bedrock lava)) {
unlink $file or warn "failed on $file: $!\n";
}

Здесь каждая операция удаляет только один файл, поэтому возвращаемое значение равно либо 0 (неудача), либо 1 (успешное удаление); мы получаем удобный логический признак для управления выполнением warn. Конструкция or warn аналогична or die – конечно, не считая отсутствия фатальной ошибки. В данном случае сообщение warn завершается символом новой строки, потому что сообщение было выдано не из-за ошибки в нашей программе. Если попытка выполнения unlink завершается неудачей, в переменную $! заносится информация, связанная с ошибкой операционной системы, которую мы включаем в сообщение. Это имеет смысл только при последовательном удалении файлов, потому что следующий неудачный запрос к операционной системе сбросит переменную. Вызов unlink не может использоваться для удаления каталога (подобно тому, как каталог нельзя удалить простым вызовом rm). О том, как удалить каталог, рассказано ниже в описании функции rmdir.

А теперь один малоизвестный факт из области UNIX.


Оказывается, даже если файл недоступен для чтения, записи и исполнения (а может быть, он вообще принадлежит другому пользователю), его все равно можно удалить. Дело в том, что разрешения на удаление файла не зависят от битов разрешений самого файла; они определяются битами разрешений каталога, содержащего этот файл. Мы упоминаем об этом, потому что начинающие программисты Perl экспериментируют с unlink: они создают файл, устанавливают командой chmod разрешение 0 (запрет как чтения, так и записи) и проверяют, что вызов unlink завершается неудачей. Но вместо этого файл бесследно исчезает. Если вы хотите увидеть неудачную попытку unlink, попробуйте удалить /etc/passwd или другой системный файл. Этот файл находится под контролем системного администратора, и вы не сможете удалить его.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Альтернативный синтаксис глобов
Глобы
Дескрипторы каталогов
Изменение временных меток
Изменение разрешений

Вернуться в раздел: Perl / 12. Операции с каталогами