Php получить информацию о файле. Работа с файлами в PHP

array stat (string filename)

Собирает статистическую информацию о файле filename . Если filename является символической ссылкой, информация собирается о самом файле, а не ссылке. Функция lstat() индентична функции stat() за исключением того, что в данном случае она вернёт информацию о самой символической ссылке.

В случае ошибки, stat() вернёт FALSE . Также она выдаст предупреждение.

Возвращает массив статистической информации о файле. Массив включает следующие элементы. Индексация начинается с нуля. Также доступ к любому аттрибуту можно получить по ассоциативному ключу, который указан напротив каждого параметра; эта возможность появилась начиная с версии PHP 4.0.6:

Числовой Ассоциативный (начиная с PHP 4.0.6) Описание
0 dev номер устройства
1 ino номер inode
2 mode режим защиты inode
3 nlink количество ссылок
4 uid userid владельца
5 gid groupid владельца
6 rdev тип устройства, если устройство inode *
7 size размер в байтах
8 atime время последнего доступа (Unix timestamp)
9 mtime время последней модификации (Unix timestamp)
10 ctime время последнего изменения inode (Unix timestamp)
11 blksize размер блока ввода-вывода файловой системы *
12 blocks количество используемых блоков

* - доступен только на системах, поддерживающих тип st_blksize -- другие системы (например Windows) вернут -1.

PHP

file_exists("test.txt")//Существует ли файл? filesize("test.txt");//Узнаем размер файла //Возвращается временная метка: fileatime("test.txt");//Дата последнего обращения к файлу //date("d M Y", $atime); filemtime("test.txt");//Дата изменения файла //date("d M Y", $mtime); filectime("test.txt");//Дата создания файла(Windows) //date("d M Y", $ctime);

Файлы: режимы работы

PHP

resource fopen (string filename, string mode) // resource - возвращает указатель на файл в случае успешной работы, или FALSE в случае ошибки
Режим работы Описание
r открыть файл только для чтения;
r+ открыть файл для чтения и записи;
w открыть файл только для записи. Если он существует, то текущее содержимое файла уничтожается. Текущая позиция устанавливается в начало;
w+ открыть файл для чтения и для записи. Если он существует, то текущее содержимое файла уничтожается. Текущая позиция устанавливается в начало;
а открыть файл для записи. Текущая позиция устанавливается в конец файла;
а+ открыть файл для чтения и записи. Текущая позиция устанавливается в конец файла;
b обрабатывать бинарный файл. Этот флаг необходим при работе с бинарными файлами в ОС Windows.

Открытие и закрытие файлов в PHP

PHP

$fi = fopen("test.html", "w+") or die("Ошибка"); //Примеры $fi = fopen("http://www.you/test.html","r"); $fi = fopen("http://ftp.you/test.html", "r"); //Закрываем fclose($fi)

Чтение файлов в PHP

PHP

//Читаем файл fread(int fi, int length) $str = fread($fi, 5); // Читаем первые 5 символов echo $str; // так как курсор передвинулся $str = fread($fi, 12); // Читаем следующие 12 символов echo $str; fgets(int fi[, int length]) // Прочитать строку из файла fgetss(int fi, int length [, string allowable]) // Прочитать строку из файла и отбросить HTML-теги // string allowable - теги, которые необходимо оставить fgetc(int fi) //Считывает символ из файла

Изначально Запись будет происходить в начало файла, путем перезаписывания существующих данных, если они есть. Поэтому, если вам нужно записать что-то в конец файла, нужно установить соответствующий режим чтения , например, a+ .

Манипуляции с курсором в файлах PHP

PHP

int fseek(int fi, int offset [, int whence]) //Установка курсора // int fi - указатель на файл //offset - количество символов, на которые нужно передвинуться. //whence: //SEEK_SET - движение начинается с начала файла; //SEEK_CUR - движение идет от текущей позиции; //SEEK_END - движение идет от конца файла. fseek($fi, -10, SEEK_END); //Читаем последние 10 знаков $s = fread($fi, 10); $pos = ftell($fi); //Узнаем текущую позицию rewind($f)//сброс курсора bool feof($f) //конец файла

Прямая работа с файлами (данными) в PHP

PHP

array file(string filename) // Получаем содержимое файла в виде массива //Еще один вариант прямой работы с данными file_get_contents(string filename) //Чтение (получаем весь файл одной строкой) //Запись в файл (изначально перезаписывается) file_put_contents(string filename, mixed data[,int flag]); //FILE_APPEND // Запись в конец файла: file_put_contents("test.txt", "данные", FILE_APPEND); //Если записать массив, $array = array("I", "live"); file_put_contents("test.txt",$array); //то получим "Ilive"

Управление файлами в php

PHP

copy(string source, string destination); // Копирование файла rename(str oldname, str newname); // Переименование файла unlink(string filename); // Удаление файла

Загрузка файлов на сервер PHP

//Настрoйки PHP.ini file_uploads (on|off) // разрешаем.запрещаем загрузку файлов upload_tmp_dir // временная папка для загружаемых файлов. по умолчания временная папка upload_max_filesize (default = 2 Mb) // макс. размер загружаемого файла post_max_size // общий размер посылаемый формы (должен быть больше upload_max_filesize) //Простая загрузка

HTML

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

PHP

//Принимаем данные $tmp = $_FILES["userfile"]["tmp_name"]; $name = $_FILES["userfile"]["name"]; //Перемещаем файл move_uploaded_file($tmp, name); move_uploaded_file($tmp, "upload/".name); // перенаправляем файл в папку upload // относительно текущего файла //Что в массиве $_FILES $_FILES["userfile"]["name"] // имя файла, например, test.html $_FILES["userfile"]["tmp_name"] // временное имя файла (путь) $_FILES["userfile"]["size"] // размер файла $_FILES["userfile"]["type"] // тип файла $_FILES["userfile"]["error"] // 0 - ошибок нет, число - есть

(PHP 3, PHP 4, PHP 5)

stat - Получает информацию о файле

Описание

array stat (string filename)

Собирает статистическую информацию о файле filename. Если filename является символической ссылкой, информация собирается о самом файле, а не ссылке. Функция lstat() индентична функции stat() за исключением того, что в данном случае она вернёт информацию о самой символической ссылке.

В случае ошибки, stat() вернёт FALSE . Также она выдаст предупреждение.

Возвращает массив статистической информации о файле. Массив включает следующие элементы. Индексация начинается с нуля. Также доступ к любому аттрибуту можно получить по ассоциативному ключу, который указан напротив каждого параметра; эта возможность появилась начиная с версии PHP 4.0.6:

Таблица 1. Формат результата работы функций stat() и fstat()

* - доступен только на системах, поддерживающих тип st_blksize, другие системы (например Windows) вернут -1.

Подсказка: Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми упаковщиками url. Список упаковщиков, поддерживаемых семейством функций stat() , смотрите в

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

Синтаксис:

Array stat(string $filename)

Этот массив всегда содержит следующие элементы с указанными ключами:

0 - устройство;
1 - Номер узла inode;
2 - атрибуты защиты файла;
3 - число синонимов ("жестких" ссылок) файла;
4 - идентификатор uid владельца;
5 - идентификатор gid группы;
6 - тип устройства;
7 - размер файла в байтах;
8 - время последнего доступа в секундах, прошедших с 1 января 1970 года;
9 - время последней модификации содержимого файла;
10 - время последнего изменения атрибутов файла;
11 - размер блока;
12 - число занятых блоков;

Этот массив помещает информацию, которая доступна в системах Unix. Под Windows многие поля могут быть пусты.

Если $filename задает не имя файла, а имя символической ссылки, то всетаки будет возвращена информация о том файле, на который ссылается эта ссылка (а не о ссылке).

fileinode()

Получить номер inode файла (PHP 3, PHP 4, PHP 5)

Описание:

Int fileinode (string filename)

Функция возвращает номер inode файла или FALSE в случае возникновения ошибки.

Замечание

fileowner()

Получить идентификатор владельца файла (PHP 3, PHP 4, PHP 5)

Описание:

Int fileowner (string filename)

Функция возвращает числовой идентификатор владельца указанного файла или FALSE в случае возникновения ошибки. Чтобы получить имя владельца в виде строки, используйте функцию posix_getpwuid().

Замечание : Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache().

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми упаковщиками url.

fileperms()

Получить информацию о правах на файл (PHP 3, PHP 4, PHP 5)

Описание:

Int fileperms (string filename)

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

Замечание : Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache().

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми упаковщиками url. Список упаковщиков, поддерживаемых семейством функций stat(), смотрите в Прил. M.

Вывод прав в восмеричном представлении

echo substr(sprintf("%o", fileperms("/tmp")), -4);
echo substr(sprintf("%o", fileperms("/etc/passwd")), -4);
?>

Это выведет:

1777
0644

Вывод полной информации о правах

$perms = fileperms("/etc/passwd");

if (($perms & 0xC000) == 0xC000) {
// Сокет
$info = "s";
} elseif (($perms & 0xA000) == 0xA000) {
// Символическая ссылка
$info = "l";
} elseif (($perms & 0x8000) == 0x8000) {
// Обычный
$info = "-";
} elseif (($perms & 0x6000) == 0x6000) {
// Специальный блок
$info = "b";
} elseif (($perms & 0x4000) == 0x4000) {
// Директория
$info = "d";
} elseif (($perms & 0x2000) == 0x2000) {
// Специальный символ
$info = "c";
} elseif (($perms & 0x1000) == 0x1000) {
// Поток FIFO
$info = "p";
} else {
// Неизвестный
$info = "u";
}

// Владелец
$info .= (($perms & 0x0100) ? "r" : "-");
$info .= (($perms & 0x0080) ? "w" : "-");
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? "s" : "x") :
(($perms & 0x0800) ? "S" : "-"));

// Группа
$info .= (($perms & 0x0020) ? "r" : "-");
$info .= (($perms & 0x0010) ? "w" : "-");
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? "s" : "x") :
(($perms & 0x0400) ? "S" : "-"));

// Мир
$info .= (($perms & 0x0004) ? "r" : "-");
$info .= (($perms & 0x0002) ? "w" : "-");
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? "t" : "x") :
(($perms & 0x0200) ? "T" : "-"));

echo $info;
?>

Результат:

R--r--r--

fnmatch()

Совпадает ли имя файла с шаблоном (PHP 4 >= 4.3.0, PHP 5)

Описание:

Bool fnmatch (string pattern, string string [, int flags])

fnmatch() проверяет, совпадает ли переданный параметр string с указанным шаблоном подстановок оболочки (shell wildcard) pattern.

Эта функция полезна при рабоде с именами файлов, хотя может быть использована и на обычной строке. Среднестатистический пользователь знаком с подстановками оболочки, как минимум в их простейшей форме из подстановок "?" и "*", так что использование fnmatch() вместо ereg() или preg_match() для поиска в пользовательской части сайта может быть намного удобнее для пользователей, не знакомых с регулярными выражениями.

Проверяет, соответствует ли цвет шаблону подстановок оболочки.

if (fnmatch("*gry", $color)) {
echo "some form of gray ...";
}
?>

На данный момент эта функция недоступна в Windows и других POSIX-несовместимых системах.

Получает информацию о файле используя открытый файловый указатель (PHP 4, PHP 5)

Описание:

Array fstat (resource handle)

Собирает статистическую информацию о открытом файле по файловому указателю handle. Эта функция похожа на stat(), за исключением того, что она работает с открытым файловым указателем, а не именем файла.

Возвращает массив со статистической информацией на файл; формат массива подробно описан на странице описания функции stat().

Пример использования функции fstat()

// открываем файл
$fp = fopen("/etc/passwd", "r");

// собираем статистику
$fstat = fstat($fp);

// закрываем файл
fclose($fp);

// отображаем только ассоциативную часть
print_r(array_slice($fstat, 13));

Результатом выполнения данного примера будет что-то подобное:

Array
=> 771
=> 488704
=> 33188
=> 1
=> 0
=> 0
=> 0
=> 1114
=> 1061067181
=> 1056136526
=> 1056136526
=> 4096
=> 8
)

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

is_writable()

Определяет, доступен ли файл для записи (PHP 4, PHP 5)

Описание:

Bool is_writable (string filename)

Возвращает TRUE, если файл filename существует и доступен для записи. Аргумент filename может быть именем директории, что позволяет вам проверять директории на доступность для записи.

Не забывайте, что PHP может обращаться к файлу от имени того пользователя, от которого запущен веб-сервер (обычно "nobody"). Ограничения безопасного режима не принимаются во внимание.

Замечание : Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache().

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми упаковщиками url

Получает информацию о файле или символической ссылке (PHP 3 >= 3.0.4, PHP 4, PHP 5)

Описание:

Array lstat (string filename)

Собирает статистику на файл или символическую ссылку с именем filename. Эта функция идентична функции stat(), за исключением того, что если filename является символической ссылкой, возвращается статус символической ссылки, а не того файла, на который она указывает.

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

Замечание : Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache().

Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми упаковщиками url.

fileatime

Возвращает время последнего доступа к файлу.

Синтаксис:

Int fileatime(string filename)

Если файл не обнаружен, возвращает false.

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

filemtime

Возвращает время последнего изменения файла или false в случае отсутствия файла.

Синтаксис:

Int filemtime(string $filename)

filectime

Возвращает время создания файла.

Синтаксис:

Int filectime(string $filename)

filesize

Возвращает размер файла в байтах или false, если файла не существует.

Синтаксис:

Int filesize(string $filename)

Устанавливает время модификации.

Синтаксис:

Int touch(string $filename [, int $timestamp])

Устанавливает время модификации указанного файла $filename равным $timestamp (в секундах, прошедших с 1 января 1970 года).

Если второй параметр не указан, то подразумевается текущее время. В случае ошибки возвращает false.

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

Изменяет режим доступа к файлу или каталогу(PHP3, PHP4, PHP5)

Описание:

Bool chmod (string filename, int mode)

Осуществляет попытку изменения режима доступа файла или каталога, переданного в параметре filename на режим, переданный в параметре mode.

Обратите внимание, что значение параметра mode не переводится автоматически в восьмеричную систему счисления, поэтому строки (такие, как, например, "g+w") не будут работать должным образом. Чтобы удостовериться в том, что режим был установлен верно, предваряйте значение, передаваемое в параметре mode, нулем (0):

chmod("/somedir/somefile", 755); // десятичное, неверный способ
chmod("/somedir/somefile", "u+rwx,go+rx"); // строка, неверный способ
chmod("/somedir/somefile", 0755); // восьмеричное, верный способ
?>

Значение параметра mode состоит из трех восьмеричных чисел, определяющих уровень доступа для владельца файла, для группы, в которую входит владелец, и для других пользователей, соответственно. Число, определяющее уровень пользователя, может быть вычислено путем суммирования значений, определяющих права:

1 - доступ на выполнение,
2 - доступ на запись,
4 - доступ на чтение.

Более подробно о системе прав в системах Unix вы можете узнать с помощью команд "man 1 chmod" and "man 2 chmod".

//Доступ на запись и чтение для владельца, нет доступа для других
chmod("/somedir/somefile", 0600);
// Доступ на запись и чтение для владельца, доступ на чтение для других
chmod("/somedir/somefile", 0644);
// Полный доступ для владельца, доступ на чтение и выполнение для других
chmod("/somedir/somefile", 0755);
// Полный доступ для владельца, доступ на чтение и выполнение для группы владельца
chmod("/somedir/somefile", 0750);
?>

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Замечание: Текущим пользователем является пользователь, от имени которого выполняется PHP. Возможно, что этот пользователь будет отличаться от пользователя, под именем которого вы получаете доступ к командной оболочке или учетной записи FTP.

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

Замечание: Когда безопасный режим включён, PHP проверяет имеет ли файл или директория, с которой вы работаете, такой же UID, как и выполняемый скрипт. Кроме того, вы не можете устанавливать SUID, SGID и "липкие" биты.

Задача
Необходимо прочитать метаданные файла, например права доступа и имя владельца.

Решение
Вызовите функцию stat(), которая возвращает массив информации о файле:

$info = stat("harpo.php");

Обсуждение
Функция stat() возвращает массив информации о файле и с числовыми, и со строковыми индексами.

Элемент mode возвращенного массива содержит права доступа в виде целого числа по основанию 10. Это сбивает с толку, поскольку права доступа обычно выражаются либо символически (т. е. вывод команды ls -rw-r--r--), либо в виде восьмеричного числа (т. е. 0644). Конвертировать права доступа в более понятный формат позволяет функция base_convert(), преобразующая права доступа в восьмеричное число:

$file_info = stat("/tmp/session.txt");
$permissions = base_convert($file_info["mode"],10,8);

В результате получим восьмеричное число из шести цифр. Например, если команда ls показывает о /tmp/session.txt следующее:

То значение элемента $file_info["mode"] равно 33204, а значение переменной $permissions равно 100664.

Последние три цифры (664) определяют права доступа к файлу: пользователя (чтение и запись), группы (чтение и запись) и всех остальных (чтение). Третья цифра, 0, означает, что для файла не установлен ни бит смены идентификатора пользователя (setuid), ни бит смены идентификатора группы (setgid). Крайнее слева число 10 означает, что это обычный файл (а не сокет, символическая ссылка или другой специальный файл).

Поскольку функция stat() возвращает массив как с числовым, так и со строковым индексами, то в результате выполнения цикла foreach по этому массиву мы получаем две копии каждого значения. И поэтому надо обратиться к циклу for от элемента 0 до элемента 12 возвращенного массива.

Функция fstat() аналогична рассмотренной stat() и принимает дескриптор файла (возвращенный функцией fopen() или popen()) в качестве аргумента. Функцию fstat() можно применять только для локальных файлов и нельзя – к URL, передаваемым функции fopen().
PHP-функция stat() осуществляет дорогостоящий базовый системный вызов stat(2).

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

File_exists(), fileatime(), filectime(), filegroup(), fileinode(), filemtime(), fileowner(),
fileperms(), filesize(), filetype(), fstat(), is_dir(), is_executable(), is_file(), is_link(), is_readable(), is_writable() и lstat().