AllInfo
Main: Info Blog Temp Mail


unix 2015-08-23 02-15-15

Работа с файлами в Perl. Примеры


Работа с данными
Создание нового файла, открытие файла, запись в файл
Чтение данных из файла
Манипуляции с файлами
Как переименовать файл
Как получить информацию о файле (дата создания и т.п.)
Как изменить время последнего обращения к файлу и его модификации
Как удалить файл
Как изменить права доступа к файлам
Как изменить владельца файла
Перемещение и копирование файлов. File::Copy
Полезные ссылки

Работа с данными


Создание файла, открытие файла, запись в файл

use strict;

open FILE, '>>file.txt';

print FILE "Холодное сердце согреешь руками\n";
print FILE "И я буду рядом, ночами и днями\n";

close FILE;

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

< — режим чтения
> — режим записи. Если файл уже содержал что-то, эти данные будут удалены
>> — режим записи. Запись новых данных будет вестись в конец файла. Старые данные сохраняются
+< — сохраняет содержимое открываемого файла
+> — сначала очищает содержимое открываемого файла
+>> — сохраняет содержимое открываемого файла, запись в файл всегда осуществляется в конец содержимого файла

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

Если открыть для записи файл, который еще не существует, то при завершении работы будет создан новый файл.


Чтение данных из файла

open FILE, 'file.txt';

while (defined (my $file_line = <FILE>)) {
print $file_line;
}

close FILE;

Чтение из файла осуществляется построчно.
Манипуляции с файлами


Как переименовать файл

rename "file.txt", "file2.txt";

Функция rename — переименовывает указанный список файлов. Возвращает 1 в случае успешного переименования, в другом случае — 0.

my $status = rename "file2.txt", "file.txt";
print "Файл успешно переименован\n" if $status;


Как получить информацию о файле (дата создания и т.п.)

#!/usr/local/bin/perl

use strict;

my %file_info = ();

($file_info{dev},$file_info{ino},$file_info{mode},$file_info{nlink},
$file_info{uid},$file_info{gid},$file_info{rdev},$file_info{size},$file_info{atime},
$file_info{mtime},$file_info{ctime},$file_info{blksize},
$file_info{blocks}) = stat('file.txt');

my ( $sec, $min, $hour, $mday, $mon, $year, $wday ) = gmtime($file_info{mtime});
$year+=1900; $mon+=1;
print "Время последнего изменения файла: $mday-$mon-$year , $hour:$min\n";

exit;

Функция stat возвращает информацию в списковом контексте, в следующем порядке:

dev — Номер устройства в файловой системе
ino — Номер индексного дескриптора
mode — Режим файла (тип и права доступа)
nlink — Количество жестких ссылок на файл (в отсутствии ссылок равно 1)
uid — Числовой идентификатор владельца файла
gid — Числовой идентификатор группы владельца файла
rdev — Идентификатор устройства (только для специальных файлов)
size — Размер файла в байтах
atime — Время последнего обращения к файлу с начала эпохи
mtime — Время последнего изменения файла с начала эпохи
ctime — Время изменения индексного дескриптора с начала эпохи
blksize — Предпочтительный размер блока для операций ввода/вывода
blocks — Фактическое количество выделенных блоков для размещения файла

Начало эпохи датируется 1 января 1900 года 0 часов 0 минут.

Таким образом можно, например, проверить дату последнего изменения файла и удалить его.


Как изменить время последнего обращения к файлу и его модификации

Функция позволяет utime() изменить время последнего обращения (atime) и модификации файла (mtime).

my $atime = time; # т.е. текущее время
my $mtime = time;

utime($atime, $mtime, "file.txt", "file2.txt");

Функция возвращает число файлов, для которых операция изменения времени прошла успешно.


Как удалить файл

Функция unlink удаляет переданный список файлов. Возвращает число успешно удаленных файлов.

unlink "file2.txt", "file3.txt";


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

chmod 0666, "file.txt";

Функции chmod можно передать список файлов, тогда права доступа будут изменены к каждому из них. Функция задает права доступа для владельца файла, группы и для всех остальных пользователей.

chmod() возвращает число файлов, права доступа к которым были благополучно изменены.

Памятка: чтобы установить права доступа, нужно указать число:

1 (- -x) — возможно только выполнение файла
2 (-w-) — возможна только запись в файл
3 (-wx) — только запись в файл и его выполнение
4 (r- -) — только чтение данных из файла
5 (r-x) — только чтение и выполнение файла
6 (rw-) — только чтение и запись в файл
7 (rwx) — полный доступ: возможно чтение, запись в файл и его запуск на выполнение.


Как изменить владельца файла

Чтобы изменить владельца файла, надо знать его uid и gid. Ну и кроме того, надо иметь права на выполнение данной команды.

Если нужно изменить владельца сразу нескольким файлам, можно передать ф-ции список файлов.

Узнать uid и gid текущего владельца файла можно с помощью ф-ции stat.

my $uid = 257;
my $gid = 7;

my $res = chown($uid, $gid, "file.txt", "assa.txt");
print "Число измененных файлов: $res\n";

chown() возвращает число файлов, владелец для которых был благополучно изменен.


Перемещение и копирование файлов. File::Copy

Модуль File::Copy предоставляет 2 удобные функции для копирования и перемещения файлов из одного места в другое.

use File::Copy;

copy("/home/user/file.txt","/home/user/file2.txt") || die "Copy failed: $!";
move("/home/user/file2.txt","/home/user/file3.txt") || die "Move failed: $!";

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

use File::Copy;

open FILE, '>file.txt';
copy ("/home/user/file2.txt", \*FILE) or die "Copy failed: $!";

close FILE;


Полезные ссылки

search.cpan.org: File::Copy

http://perl.find-info.ru/perl/006/file.htm
http://www.spravkaweb.ru/perl/file/
http://www.codenet.ru/webmast/perl/files.php

http://dev-lab.info/2011/01/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%D0%B8-%D0%B2-perl-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/

3.92.91.54 / 2024-07-14_13-45-18 UTC.