Masters of CGI.Perl
 Сайт клуба знатоков CGI.Perl 
FAQ · Статьи · Конференция · Ссылки · Скрипты

Часто задаваемые Вопросы.. F.A.Q.

Дайджест от 15.11.2000

Если Вы не нашли ответ на свой вопрос в этом дайджесте, то попробуйте найти его в основной базе:

Ключевые слова

Напоминаем, Вы можете получать FAQ на свой e-mail !!! Достаточно подписаться на нашу почтовую конференцию.
 

  Название : Файлы 

  1. Как можно организовать многопользовательский доступ к файлу ?
  2. Нужно прочитать файл по строкам в обратном направлении. Как это можно сделать ?
  3. Как узнать размер файла (дату создания, атрибуты, разрешения на доступ)?
  4. Hадо записать в файл строку, а потом прочесть ее оттуда
  5. Хочу прочитать список файлов в каталоге, но почему-то не работает или глючит.
    Делаю так: @files=<*>;

 

Как можно организовать многопользовательский доступ к файлу ?


Если файл открывается для чтения, то проблем не будет. Если же для записи - то есть несколько способов. Один из них заключается в создании временного файла (например, my.lock), на время модификации скриптом исходного файла, а затем удаления этого my.lock. При этом скрипт перед модификацией файла должен проверять наличие my.lock. В случае его присутствия - ожидать конца работы одного из процессов(скриптов). Вот пример:

while (-e "my.lock") { sleep(2); }
open(LOCKED,">my.lock");
# что-то делаем с исходным файлом
unlink "my.lock";
Другой способ заключается в блокировании файла с помощью системной функции flock() на время модификации, с последующим разблокированием:
  unless (open(F, ">$FileName")) { print "Ошибка при открытии файла: $FileName Причина: $!";exit; }
flock(F, 2); # Блокируем файл для записи
print F shift;
close F;

Дата добавления: 7.09.2000 Прислать свои комментарии  Наверх 

Нужно прочитать файл по строкам в обратном направлении. Как это можно сделать ?


Для этого занесите строки в массив в обратном порядке:
@massive=reverse <FILE>;
foreach $massive (@lines) {
# Что-нибудь сделать
}

Дата добавления: 5.09.2000 Прислать свои комментарии  Наверх 

Как узнать размер файла (дату создания, атрибуты, разрешения на доступ)?


С помощью так называемых файловых тестов, которые имеют вид (-тест "имя файла"), например:
    (-s "file.txt") размер файла
-e существует ли файл
-w доступен ли на запись
-M количество дней со дня модификации
-t является ли терминалом
Автор: Павел Аммосов

Дата добавления: 31.08.2000 Прислать свои комментарии  Наверх 

Hадо записать в файл строку, а потом прочесть ее оттуда


# записать строку в файл
open FILE,'>file'; # открыть файл на запись
print FILE 'строка'; # записать строку
close FILE; # закрыть файл

# прочитать строку из файла
open FILE,'file'; # открыть файл на чтение
$string=<FILE>; # прочесть одну строку, включая символ "перевод строки"
chomp($string); # обрезать в конце строки "перевод строки", если он есть
close FILE; # закрыть файл
Источник: FIDO - RU.CGI.PERL (FAQ created by SLY Golovanov, 2:5020/794.13)

Дата добавления: 31.08.2000 Прислать свои комментарии  Наверх 

Хочу прочитать список файлов в каталоге, но почему-то не работает или глючит.
Делаю так: @files=<*>;


Такой способ вызывает внешнюю программу glob (также, как и способ @files=glob("*")). Это неправильно не только потому, что на запуск внешней программы уходит время и ресурсы, но и потому, что где-нибудь этой программы может просто не оказаться. Более правильный способ - это:
opendir DIR,'/tmp';
@files=readdir DIR;
closedir DIR;
или
opendir DIR,'/tmp';
while $file (readdir DIR)
{
}
closedir DIR;
Заметьте, что в $file будут подставляться как имена файлов, так и имена подкаталогов.
Hесколько подсказок. Чтобы прочесть список файлов, в котором не содержалось бы '.' и '..', можно написать следующее:
opendir DIR,'/tmp';
@files=grep !/^\.+$/,readdir DIR;
closedir DIR;
Таким же способом,- с помощью regexp,- можно задавать любые другие маски файлов. Если вы хотите прочесть список каталогов, не трогая файлы:
opendir DIR,/tmp';
@dirs=grep {!/^\.+$/ and -d "/tmp/$_"} readdir DIR;
closedir DIR;
Источник: FIDO - RU.CGI.PERL (FAQ created by SLY Golovanov, 2:5020/794.13)

Дата добавления: 31.08.2000 Прислать свои комментарии  Наверх 

Сайт клуба знатоков CGI.Perl - Masters of CGI.Perl
Designed by MoveR Studio © 2000  - | -  Вопросы? Предложения? пишите