Задание пути к файлу, получение информации о файле и чтение каталога рассматривается в предыдущей статье "Чтение файлов и каталогов в php-сценарии". Поскольку описание различных возможностей чтения данных из файла занимает много места, оно вынесено в эту отдельную статью, которая, тем не менее, является логическим продолжением первой. В этой статье:
- Обзор функций
- Чтение содержимого файла без предварительного открытия
- Подавление вывода ошибки на экран
Содержание
Обзор функций
возвращает количество прочитанных из файла байт. В случае ошибки возвращает FALSE и выводит сообщение об ошибке.
режим mode:
'r' - только для чтения; указатель в начале файла. Если файл не существует, возвращает FALSE.
'r+' - для чтения и записи; указатель в начале файла. Если файл не существует, возвращает FALSE.
'w' - только для записи. Содержимое существующего файла стирается. Если файл не существует, пытается создать файл.
'w+' - для чтения и записи; указатель в начале файла. Содержимое существующего файла будет перезаписано. Если файл не существует, пытается создать файл.
'a' - только для записи (для добавления данных в файл); указатель в конце файла. Если файл не существует, возвращает FALSE.
'a+' - для чтения и записи; указатель в конце файла (универчальный режим). Если файл не существует, пытается создать файл.
***После буквы, обозначающей режим, может следовать модификатор
"b" - бинарный (двоичный) режим, применяется по умолчанию
"t" - текстовый режим
***Необязательные аргументы. Можно задать use_include_path, равный 1, если нужно искать файл в каталоге include_path. (Параметр include_path определяется в файле php.ini), а $zcontext задает контекст файла для дополнительной обработки потоков данных.
SEEK_SET - смещение = offset байт
SEEK_CUR - смещение = текущее + offset
SEEK_END - смещение = размер файла + offset (offset<0 - смещение от конца файла)
$length - должен быть больше самой длинной строки (включая символ конца строки). Если не указан, максимальная длинна строки не ограничена, но функция работает немного медленнее.
$delimiter - разделитель поля (используется только один первый символ), по умолчанию - запятая.
$enclosure - ограничитель поля (используется только один первый символ), по умолчанию - двойная кавычка.
Чтение содержимого файла по заданному пути к этому файлу
Если нужно просто прочитать, возможно, не очень большой текстовый файл, можно это сделать с помощью одной функции:
$path="text.txt";
$lines=file($path); // массив строк, которые можно обработать и
echo join("<>", $lines);// вывести в браузер
Если в файле lines.txt три строки, и он записан в Windows-формате, массив (список) $list содержит три элемента:
Line1rn Line2rn Line3
т.е. функция file() не вырезает символы новой строки и не выполняет их трансляцию.
// весь файл в одну строку
$a=file($path, filesize($path));
$a=file_get_contents ($path);// еще проще
// первые 20 байт
$content=file_get_contents("http://www.example.com/text.txt",FALSE,NULL,0,20);
readfile($path); // вывод содержимого файла
Пример: вывод изображения
Задача: вывести изображение с помощью php так, чтобы был скрыт путь к этому изображению
<html><body> <img src=showimage.php> </body></html>
Файл showimage.php:
<?php
header("Content-type: image/jpg");
readfile("image.jpg");
?>
Подавление вывода ошибки
Вы же не хотите показывать сообщение интерпретатора об ошибке пользователю на HTML-странице, если функция открытия файла возвращает FALSE? В предыдущей статье описаны функции, которые позволяют проверить существование файла (file_exists), является ли заданный путь путем к существующему файлу (is_file), и возможность чтения файла (is_readable($path) ), но они применимы только к локальным файлам.
Оператор @
Когда перед php-выражением стоит @, сообщения об ошибках, генерируемые этим выражением, не выводятся, причем это не относится к синтаксическим ошибкам. Для того чтобы сообщение об ошибке сохранялось в переменную среды $php_errormsg, в файле php.ini должна быть включена опция конфигурации track_errors. (Переменная $php_errormsg перезаписывается при появлении каждой новой ошибки.)
//Заведомо неверный путь к файлу
$my_file = @fopen("'non_existent_file");
Это выражение будет проигнорировано, и выполнение сценария продолжится. Но поскольку файл не был открыт, сценарий не может быть нормально выполнен (этот файл был для чего-то нужен!).
Конструкция or die()
Если не удается выполнить какую-то операцию, например, открыть файл, тогда вывести соответствующее сообщение и корректно завершить работу сценария позволяет конструкция
вызов_функции or die("сообщение");
Второй операнд оператора "or" (логическое ИЛИ) выполняется, только когда первый операнд возвращает (равен) FALSE .Например,
$my_file = @fopen ("non_existent_file") or die ("Не удалось открыть файл");
Появится сообщение "Не удалось открыть файл", и работа сценария будет завершена.