Рейтинг@Mail.ru

Открытый вопрос

Оценить: 1 2 3 4 Средний рейтинг: 0.00 / 0 Проголосовавших

click

Олег

+
-

Для начала следует разобраться, что такое файловые манипуляторы.

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

Есть стандартные файловые манипуляторы Перл. Они называются STDIN (стандартный ввод), STDOUT (стандартный вывод) и STDERR (стандартный поток ошибок). Например параметры скрипту из формы передаются именно через STDIN (при условии использования метода POST).

Если понадобится создать копию файлового манипулятора (не файла, а только манипулятора по которому осуществляется доступ к файлу), то можно воспользоваться функцией open (о ней подробнее поговорим позже).

Пример:

open(FILL,"file.txt");

open(FAIL,"<&FILL");

О присваивании переменным файловых манипуляторов:

$handle=*FILL;

или передать его в функцию:

some_sub(*FILL);

Кстати, файловые манипуляторы в Perl используются не только для связи с, собственно, файлом. Они могут быть связаны с, например, сокетом.

Манипуляции с файлом

Открывать файл можно с помощью функции open:

open(FFF,"> file.txt");

 У функции есть три параметра, которые вы должны указать: FFF – задаеться название файлового манипулятора, ">" – режым доступа, и на конец "file.txt" - имя нужного вам файла. Есть три режима доступа, которые обычно используються: ">" - запись,"<"- чтение, ">>"- добавление в файл.

Есть еще более сложная функция sysopen. Но, зато с ее помощью вы задаете большее количество параметров (таким образом лучше «обьясняя» системе, что вы собираетесь делать).

В sysopen три обязательных параметра, как и в open, но есть и один необязательный.

Например:

sysopen(FH,$name, $flags, $param);

FH -указываете файловый манипулятор, $name - имя файла в чистом виде (без ">" и др.). В $flags помещаем число, полученное объединением нижеописанных констант через OR ( | ):

O_RDONLY

Только для чтения

O_WRONLY

Только для записи

O_RDWR

Для чтения и для записи

O_CREAT

Если файла нет, создать!

O_APPEND

Открытие в режиме присоединения

O_TRUNC

Очищаем содержимое при открытии

Здесь не полный их перечень, но, как правило, их вполне достаточно, так как они используються чаще всего.

И наконец $param – не обязательный параметр. Он параметр задает маску доступа к файлу и записывается в восьмеричной системе. Обычно используется значение, что обозначает обычный файл - 0666 (значение по умолчанию, то есть если $param опущен), или 0777, когда имеется ввиду каталог либо иполняемый файл ..

Пример:

sysopen(FH,"data.txt",O_WRONLY|O_TRUNC|O_CREATE);

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

Запись в файл делаем функцией print.

print(FFF "Моя первая запись в файл!");

Здесь FFF - имя файлового манипулятора, а второй параметр (строка в кавычках) - текст, который мы хотим записать в файл, манипулятор которого указан первым параметром FFF.

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

Указание файлового манипулятора не является обязательным для функции print. Если вы его не указали, то эта функцыя осуществит вывод в STDOUT (то же относится к функциям printf и write). Чтобы изменить направление вывода в Perl предусмотрена функция select (правда не только для этого). Пример:

open(F1,"> one.txt");

print "Файл открыт! Пишем в STDOUT.";

$old_point=select(F1);

print "Пишем в файл one.txt";

select($old_point);

print "Снова пишем в STDOUT.";

close(F1);

Закрываем файл функцией close.

close(FFF);

Хотя при завершении процесса, в котором был открыт данный файл, файл закрывается автоматически, все же, рекомендуется придерживаться порядка и закрывать файл этой процедурой после завершения работы с ним.

Блокировка файла

Если несколько процессов одновременно пытаются получить доступ к файлу, особенно для записи, то это может привести к серьёзным ошибкам и сбоям. Поэтому нужен механизм блокировки  файлов, который не дает пользоваться файлом всем процессам одновременно, а как бы ставит их в очередь. Делаем так:

open(FIL,"> file.dat");

flock(FIL,2);

close(FIL);

О функциях open и close я уже говорил, а на flock остановимся немного подробнее. Она получает два параметра - файловый манипулятор и, режым блокировки.

  • 1 совместная блокировка (для чтения)
  • 2 монопольная блокировка (для записи)
  • 4 асинхронный запрос блокировки
  • 8 снятие блокировки

При завершении процесса блокировка снимается автоматически. Если вы вдруг решили это сделать вручную – будьте осторожны, так как вы разрешаете любому другому процессу делать с файлом что угодно.

Работа со строками в файле

Строковые файлы - пожалуй самый удобный способ хранить информацию на компьютере имея при этом доступ к находящейся в нем информации в любой момент.

Для чтения строк из файла используется файловый манипулятор "поставленный" в <>, как в следующей конструкции:

open(FIL,"data.txt");

while(<FIL>)

{

# делаем что-то с каждой строкой файла

}

Внутри подобного цикла используется стандартная переменная "$_", а номер строки записывается в "$.". Конец строки как правило обозначается специальным символом  "\n". Можно его отрезать функцией chomp.

open(FIL,"data.txt");

while(<FIL>)

{

chomp;  # отрезается спецсимвол от переменной $_

print;  # пишем $_ на STDOUT

}

Можно прочитать строки в массив:

@strings=<FIL>;

foreach $line (@strings)

{

print $list;

}

Для передвижения по файлу используются функции tell и seek.

open(FIL,"data.txt");

$position=tell(FIL);

print "Текущая позиция в файле $position. \n";

seek(FIL,$position+10,1);

print "А теперь переместились на 10 байт к концу файла от текущей позиции. \n";

$position=tell(FIL);

print "Теперь текущая позиция в файле $position. \n";

Результат:

Текущая позиция в файле 0.

А теперь переместились на 10 байт к концу файла.

Теперь текущая позиция в файле 10.

Функция tell в качестве параметра принимает файловый манипулятор. А что касается seek, то она берет три параметра. Файловый манипулятор, смещение в байтах, направление смещения: 0 - от начала файла, 1 - от текущей позиции, 2 - с конца файла.

Это пожалуй все, чем я могу вам помочь.

 

Ответил Олег 1 месяц назад Пожаловаться

Добавить комментарий

Оценить: 1 2 3 4 Средний рейтинг: 0.00 / 0 Проголосовавших


Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:

Комментарий:
Введите символы: *
captcha
Обновить

Нашли ответ на свой вопрос?
Помогите и другим пользователям: