Відкриття та закриття файлу

Для того щоб отримати в програмі доступ до інформації, що міститься у файлі, слід перш за все створити дескриптор файлу, який в подальшому буде «представником» цього файлу в різних операціях вилучення з нього і записи в нього інформації. Але до того як можна буде здійснювати різні маніпуляції з вмістом файла, він повинен бути відкритий, а після завершення роботи з ним - закритий. Зазвичай у всіх мовах програмування дескриптор файлу (в інших мовах можуть використовуватися інші терміни для механізму посилання на файл, який ми в Perl називаємо дескриптором) створюється одночасно з відкриттям файлу. У Perl для цих цілей служить стандартна функція ореn (), що є списковому операцією. Її виклик може мати три різні форми: Перші дві форми операції open відкривають файл з ім'ям, рівним значенню параметра Імя_файла, представленого або рядком, або виразом, значення якого повинно бути рядком. При цьому створюється і асоціюється з файлом його дескриптор, ім'я якого визначається параметром ДЕСКРИПТОР. Цей параметр повинен представляти правильний ідентифікатор Perl (послідовність алфавітно-цифрових символів, що починається з букви), але може бути і виразом. В цьому випадку обчислене значення виразу обов'язково також має бути правильним ідентифікатором. Операція open без імені файлу відкриває файл, ім'я якого міститься в скалярної змінної $ ДЕСКРИПТОР, створюючи для нього дескриптор, який визначається параметром ДЕСКРИПТОР. Зауважимо, що змінна, що містить ім'я файлу, що відкривається, не може бути локальною лексичної, яка визначається функцією my (). Лістинг 6.6 демонструє використання операції open () для відкриття файлів. (Поки ми не ввели поняття режиму відкриття файлу, вважаємо, що всі файли відкриваються тільки для читання.) Лістинг 6.6. Різні форми операції open відкриття файлів Зверніть увагу, що у всіх операторах відкриття файлу перевіряється повертається значення функції open, що дорівнює «істина» в разі успішного відкриття файлу і «брехня» в іншому випадку. Причому, якщо сталася якась помилка, то викликається стандартна функція die (), яка друкує повідомлення і припиняє виконання сценарію. Зазвичай вважається, що помилка відкриття файлу настільки серйозна, що програма не може далі виконувати. Якщо у вашому випадку це не так, то можна просто перевірити (а це рекомендується робити завжди!) Повертається функцією open значення і вжити необхідних заходів в самій програмі.

ПРИМІТКА Якщо задано не повне ім'я файлу, то відкривається файл з вказаним ім'ям і розташований в поточному активному каталозі. Можна задавати повне ім'я файлу (див. Третій оператор open з лістингу 6.6), однак слід мати на увазі, що воно залежить від операційної системи. Наприклад в Windows слід обов'язково вказати ім'я дисковода d: /perl/bin/perl.bat, якщо тільки файл не розташований на поточному активному диску. Кількість одночасно відкритих в програмі файлів залежить від операційної системи. Наприклад, в системі UNIX можна відкрити досить велика кількість файлів, тоді як в DOS і Windows кількість відкритих файлів залежить від встановленого значення змінної оточення FILES (від одного до 255) і в основному варіюється від 20 до 50 одночасно відкритих файлів.
ПРИМІТКА Деякі операційні системи вимагають встановлювати покажчик читання / запису файлу при перемиканні з операцій читання на операції запису. У Perl для цього призначена функція seek (), опис якої буде дано дещо пізніше в цьому ж параграфі. При відкритті файлів в режимі читання / запису за допомогою функції ореn () в формі з одним і двома параметрами відповідають трьом можливим режимам послідовності символів повинні бути додані у вигляді префікса до назви файла з допускаються між ними і іменами файлів довільним числом прогалин, наприклад, " +> File.dat ".

Відкриття файлу і створення для нього дескриптора функцією open () є хорошим і зручним способом установки режиму роботи з файлом, а також при необхідності створення нового файлу. Однак можливості цієї функції не дозволяють поставити права доступу для новостворених файлів, що є їх важливою характеристикою в системі UNIX (див. Примітку нижче), а також вирішити проблему, чи слід створювати файл, якщо його не існує.

ПРИМІТКА У UNIX для кожного файлу визначені права доступу для власника файлу (користувача, який створив його), для групи користувачів, в яку входить власник файлу, і для всіх інших користувачів. Ці права в кожній з перерахованих груп включають в себе право на читання файлу, право на запис у файл і право на виконання файлу, що подаються у вигляді трехбітового двійкового числа, яке зручно інтерпретувати у вигляді восьмеричного числа: значення 4 визначає право на читання, 2 - на запис і 1 - на виконання. Решта восьмеричні числа до 7 включно представляють комбінацію прав доступу. Наприклад, значення 6 визначає права читання і запису (4 + 2 = 6). Таким чином, для кожної з перерахованих груп користувачів (власник файлу, користувачі його групи і всі інші) за допомогою вісімкового числа від 0 до 7 можна задати всі можливі комбінації прав доступу, що зазвичай представляється у вигляді тризначного вісімкового числа. Наприклад, значення 0666 (нуль нічого не визначає, а служить лише покажчиком, що це вісімкове число) повідомляє, що для файлу визначені права на читання і запис, але не на виконання, для всіх трьох груп можливих користувачів.

Функція open () створює файли зі значенням прав доступу, рівним 0666. Для «тонкого» відкриття файлів з дозволом створення файлу в разі його відсутності, із зазначенням прав доступу для новостворюваного файлу і т. П. Слід замість функції open (), яка є інтерфейсом до відповідної функції стандартної бібліотеки stdio мови с, використовувати стандартну функцію Perl sysopen (), безпосередньо що обертається до функції open () операційної системи і дозволяє програмісту самому задати окремі компоненти режиму роботи з файлом: читання, запис, ство ание, додавання, очищення вмісту і т. д. Виклик цієї функції виглядає наступним чином: Тут параметр Імя_файла представляє просто ім'я файлу, параметр РЕЖИМ визначає режим відкриття файлу і являє собою число, яке є результатом операції побітового АБО (|) над константами режимів, визначеними в модулі Fcntl. Об'єкти, що можуть констант залежить від операційної системи. У табл. 6.1 перераховані константи режиму, що зустрічаються практично у всіх операційних системах. Таблиця 6.1. Найбільш вживані константи режиму доступу до файлу

Очищення вмісту файлу

Щоб отримати доступ до перелічених у табл. 6.1 іменованих констант режимів, слід в програмі підключити стандартний модуль Fcntl оператором use Fcntl ;, який зазвичай записується на початку програми. Необов'язковий параметр ДОЗВІЛ визначає права доступу до створюваного файлу в системі UNIX і задається у вигляді восьмеричного числа. Зауважимо, що при визначенні фактичних прав доступу до файлу враховується також поточне значення маски доступу до процесу, в якому виконується сценарій, що задається функцією umask (). Якщо параметр ДОЗВІЛ не заданий, то в якості прав доступу Perl використовує значення 0666.

РАДА Якщо виникають труднощі з установкою прав доступу, то дотримуйтеся наступного правила: для звичайних файлів передавайте 0666, а для каталогів і виконуваних файлів - 0777.

З відкриттям файлів функцією open () разом з еквівалентними їм зверненнями до функції sysopen () можна ознайомитися в лістингу 6.7. Лістинг 6.7. Відкриття файлів При відкритті файлу функції open () і sysopen () повертають значення 0, якщо відкриття файлу з заданим режимом сталося Успіння, і невизначене значення undef в іншому випадку. Ще раз нагадаємо, що завжди слід перевіряти успішність виконання операції відкриття файлу, припиняючи виконання програми функцією die (). У видимій частині повідомленні функції die () можна використовувати спеціальну змінну $. в якій зберігається системне повідомлення або код помилки. Ця інформація допомагає виявити і виправити помилки в програмі. Наприклад, якщо в операторі змінна $ file містить ім'я неіснуючого файлу, то при його виконанні користувач може побачити повідомлення наступного виду: Для повноти опису роботи з функцією open () слід сказати, що якщо ім'я файлу являє рядок "-", то відкривається файл відповідає стандартному пристрою введення з дескриптором STDIN. Значення, рівне рядку "> -", відповідає висновку на стандартний пристрій виводу з дескриптором STDOUT.

ПРИМІТКА Якщо стандартне введення або висновок були змінені під час запуску сценарію з командного рядка, то операції введення-виведення за допомогою дескрипторів, відповідних файлів "-" і "> -", будуть здійснюватися в файли, визначені під час перепризначення стандартного вводу або виводу.

Схожі статті