Поиск

Каталоги

На этом занятии уже упоминалось о том, что каталоги на диске организованы в виде древовидной структуры, что для открытия файла иногда требуется указать его полный путь и что содержимое каталога можно прочитать с помощью функции readdir. Однако с помощью Perl можно еше перемещаться по каталогам, создавать и удалять их, а также удалять файлы, содержащиеся в каталогах (очищать каталоги).

Перемещение по каталогам

При запуске какой-либо программы операционная система "запоминает" текущий каталог, в котором находился пользователь перед вводом команды. В системе UNIX после регистрации пользователь обычно попадает в свой рабочий каталог. Чтобы узнать, в каком каталоге вы находитесь, в системе UNIX используется команда pwd. При работе в режиме командной строки MS-DOS или Windows путь к текущему каталогу отображается в виде приглашения, например C:\WINDOWS>. Кроме того, если в сеансе MS-DOS ввести команду cd без параметров, операционная система выведет на экран путь к текущему каталогу. Таким образом, каталог, используемый по умолчанию системой в настоящий момент, называется текущим каталогом.

Если вы работаете в одном из текстовых редакторов или интегрированной среде разработки и пытаетесь запустить на выполнение программу на Perl прямо из среды разработки, то текущий каталог, установленный операционной системой для вашей программы, может не соответствовать ожидаемому. Таким каталогом может являться каталог, в котором находится программа на Perl, рабочий каталог текстового редактора или любой другой каталог (в зависимости от установленных параметров среды разработки). Чтобы определить в программе на Perl рабочий каталог, воспользуйтесь функцией cwd.

Если при открытии файла не указан полный путь к нему, как, например, в операторе open(FH, "file") || die, будет предпринята попытка открыть указанный файл в текущем каталоге. Для изменения текущего каталога в программах на Perl используется функция chdir, как показано в следующем примере:

Эта функция заменяет текущий каталог на тот, который указан в качестве параметра. Если указано имя несуществующего каталога или у вас отсутствуют права на доступ к новому каталогу, функция chdir возвращает значение false. С помощью этой функции можно временно изменить текущий каталог. Как только программа завершит свое выполнение, в качестве текущего будет восстановлен тот каталог, в котором находился пользователь перед запуском программы.

Вызов функции cbdir без параметров устанавливает в качестве текущего рабочий каталог пользователя. В системах UNIX это тот каталог, в который попадает пользователь после регистрации в системе. В Windows 9x, NT или MS-DOS рабочий каталог пользователя задается с помощью переменной окружения НОНЕ. Если такая переменная не установлена, вызов функции chdir без параметров не выполняет никаких действий.

В Perl нет встроенных функций, которые бы позволяли определить текущий каталог программы. Причина заключается в том, что в силу специфики некоторых операционных систем сделать это достаточно сложно. Для решения задачи вам следует воспользоваться двумя связанными операторами. Укажите в начале программы оператор use Cwd, а затем для определения текущего каталога воспользуйтесь функцией cwd, как показано ниже на примере:

Оператор use Cwd необходимо указывать в программе только один раз. После этого функцию cwd можно использовать столько раз, сколько нужно.

Оператор use Cwd указывает интерпретатору Perl, что в этом месте программы должен быть загружен модуль Cwd. Модули расширяют возможности Perl за счет добавления новых функций, таких как cwd. Если в предыдущем примере с использованием модулей интерпретатор выдаст ошибку типа Can't locate Cwd.pm in @INC или если вы так и не поняли, для чего вообще нужны модули, сильно не расстраивайтесь. Более подробно модули будут описаны на 14-м занятии, "Использование модулей".
Создание и удаление каталогов

Для создания нового каталога в Perl используется функция mkdir, синтаксис которой выглядит так:

Если указанный каталог успешно создан, функция mkdir возвращает истинное значение. В противном случае она возвращает ложное значение, а текст сообщения об ошибке помещается в переменную $!. Параметр права_доступа . имеет значение только в системах UNIX, однако его следует указывать всегда, независимо от того, работаете вы в UNIX или нет. В приведенных ниже примерах используется некое магическое число 0755, значение которого будет объяснено ниже, вразделе "Небольшой экскурс в UNIX". Для систем DOS и Windows просто используйте число 0755 и ни о чем не думайте! Сейчас мы не будем пускаться в долгие рассуждения, а сразу рассмотрим пример:

Для удаления каталога используется функция rmdir, синтаксис которой выглядит так:

Если указанный каталог успешно удален, функция rmdir возвращает истинное значение. В противном случае она возвращает ложное значение, а текст сообщения об ошибке помещается в переменную $!, как показано в следующем примере:

С помощью функции rmdir можно удалить только пустые каталоги. Это означает, что перед удалением каталога в нем следует сначала удалить все файлы и вложенные каталоги.

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

Для удаления файлов в Perl используется функция unlink, синтаксис которой выглядит так:

Функция unlink пытается удалить все файлы, указанные в списке, и возвращает в вызывающую программу количество удаленных файлов. Если список файлов не указан, будет удален файл, указанный в переменной $_. Рассмотрим следующие примеры:

Чтобы проверить, действительно ли были удалены все файлы из списка, нужно сравнить количество файлов в списке с тем, которое вернет функция unlink, например:

В этом примере число удаленных файлов сохраняется в переменной $erased. После выполнения функции unlink значение переменной $erased сравнивается с количеством элементов массива @files. Они должны быть одинаковыми. Если это не так, выводятся сообщение об ошибке и список тех файлов, которые не удалось удалить.

Файлы, удаленные с помощью функции unlink, восстановить уже нельзя, поскольку Perl не помещает их в корзину. Поэтому при работе с этой функцией будьте особенно аккуратны!
Переименование и перемещение файлов

Переименовать файл или каталог в Perl очень просто. Для этого используется функция rename, синтаксис которой приведен ниже:

Эта функция берет файл, имя которого указано в первом параметре, и переименовывает его в файл, имя которого указано во втором параметре. Если операция завершается успешно, функция rename возвращает истинное значение. Если в качестве первого параметра указан каталог, ему будет назначено имя, заданное во втором параметре. Если работа функции rename завершается аварийно, она возвращает ложное значение, а текст сообщения об ошибке помешается в переменную $!, как показано в следующем примере:

С помощью функции rename можно также переместить файл в другой каталог. Для этого в качестве второго параметра укажите новый путь к файлу, например:

Если окажется, что файл, заданный во втором параметре функции rename, существует, содержимое старого файла теряется.

С помощью функции rename нельзя переместить файлы из одного каталога в другой, если они принадлежат различным файловым системам.