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

Файлы обычно создаются для хранения данных. Однако со временем данные устаревают и файл приходится удалять из системы. На уровне командного процессора 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 или другой системный файл. Этот файл находится под контролем системного администратора, и вы не сможете удалить его.
Теги:
файл
Добавлено: 20 Июля 2018 21:09:04 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...