Php создание файла, чтение и запись. Работа с файловой системой Функции работы с файлами php

Работа с файлами — важный момент. Так как в них можно хранить данные, логи и т.д. Загружать файлы на сервер мы уже умеем. А теперь нужно научиться взаимодействовать с их содержимым.
Сам процесс работы с файлом разделяется на три этапа:
1. Открытие файла.
2. Работа над содержимым открытого файла.
3. Закрытие файла.

У функции fopen() есть несколько режимов, с помощью которых и открываются файлы, вот их таблица:

Список возможных режимов для fopen()
режим Описание
‘r’ Открывает файл только для чтения; помещает указатель в начало файла.
‘r+’ Открывает файл для чтения и записи; помещает указатель в начало файла.
‘w’ Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пробует его создать.
‘w+’ Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пытается его создать.
‘a’ Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. В данном режиме функция fseek() не применима, записи всегда добавляются.
‘a+’ Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. В данном режиме функция fseek() влияет только на место чтения, записи всегда добавляются.
‘x’ Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст ошибку уровня E_WARNING . Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2) .
‘x+’ Создаёт и открывает для чтения и записи; в остальном имеет то же поведение что и‘x’ .
‘c’ Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от ‘w’ ), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’ ). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотри flock() ) перед изменением, так как использование ‘w’ может обрезать файл еще до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку).
‘c+’ Открывает файл для чтения и записи; в остальном имеет то же поведение, что и ‘c’ .

К режиму можно добавить еще два значения:
b — файл открывается в бинарном режиме
t — файл открывается как текст

От слов к делу. Теперь немного практики для закрепления. Создадим в нашей папке files файл под названием test.txt, но сделаем это с помощью PHP. И запишем в него строку «Всем привет!», после чего считаем эту строку с файла и выведем на экран. Я решил все сделать в виде функций, для многоразового пользования, вот что из этого вышло:

"; else echo "Не удалось записать данные!
"; //закрываем файл fclose($file); } function fileread($filename){ //путь к файлу $path = "files/".$filename.".txt"; //открываем файл для чтения $file = fopen($path,"r"); // если файл успешно открылся if($file){ // тогда пока файл не достигнет конца while (!feof($file)) { // считываем данные с файла $read = fgets($file); // и выводим текст на экран echo $read."
"; } } // если файл не открылся, то сообщаем об этом else echo "Ошибка при открытии файла
"; // Закрываем файл fclose($file); } //Создаем файл fcreate("test","Всем привет!"); //Считываем данные из файла fileread("test"); ?>

Теперь вы можете создавать и редактировать файлы.
————————
А что ты знаешь о самых мощных суперкомпьютерах? Ничего? Тогда почитай тут

Базы данных MySQL и Access все чаще становятся общедоступными средствами хранения данных. Но в начале 1990-х была популярна работа с файлами в PHP, сохранение записей в форматированных текстовых файлах в формате CSV, разделенных новыми строками.

Основные принципы работы

Базы данных удобны, но каждый разработчик должен по крайней мере иметь некоторые базовые знания о том, как читать и писать файлы. Возможно, многие задумаются над вопросом: «Почему мне нужно это знать? Если я использую файлы, они написаны в XML, и я просто применяю синтаксический анализатор».

Итак, вот несколько причин, по которым могут понадобиться файлы:

  1. Чтобы переместить двоичные данные (например, файлы изображений) в базу данных BLOB (двоичные большие объекты).
  2. Импорт данных (например, адресов электронной почты), экспортированных из устаревшей базы данных или приложения.
  3. Чтобы из базы данных экспортировать информацию в текстовый файл для обработки в автономном режиме.

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

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

Они могут рассказать:

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

Лучше всего выучить все основные атрибуты для работы с файлами в PHP. Это во многом облегчит работу.

История файлов

Может понадобится узнать время последнего редактирования файла. В этом случае на помощь приходят функции: fileatime(), filemtime() и filectime().

"; echo $file . " имел последнее изменение i-узла " . date($formatDate, $timeM) . ".
"; echo $file . " был изменен " . date($formatDate, $timeC) . ".";

Здесь код извлекает временную метку последнего доступа и отображает ее:

  • C: Windowsfile.ini был просмотрен 19 сен 2018 4:34 вечера.
  • C: Windowsfile.ini был изменен Пт 8 окт 2018 2:03 утра.
  • C: Windowsfil.ini был изменен в Вт 16 дек 2017 4:34.

Функция filectime() показывает время изменения разной информации, связанной с файлом (например, права доступа), а filemtime() - изменения самого файла.

Функция date() использовалась для форматирования временной метки Unix, возвращаемой file*time() функциями.

Файл или нет?

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

"; echo $file . (is_dir($file) ? " " : " не") . " каталог.";

Вывод кода примера:

  • C: Windowsfile.ini файл.
  • C: Windowsfile.ini не каталог.

Таким образом можно избежать ошибок и не открыть по неосторожности «не файл». В PHP работа с файлами и каталогами аналогична.

Разрешения для файлов

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

"; echo $file . (is_writable($file) ? " " : " не") . " записывается.";

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

Код выведет следующие значения на экран:

  • C: Windowsfile.ini читается.
  • C: Windowsfile.ini не записывается.

Используя тернарный оператор, можно указать, доступен файл или нет.

Размер файла

Чтобы узнать размер файла, нужно использовать функцию filesize(). Он будет показан в байтах.

Функция выведет на экран следующее:

  • C: Windowsfile.ini имеет размер 510 байт.

Использование файла в системе Windows здесь подчеркивает один нюанс. Обратная косая черта имеет особое значение в качестве символа escape. Нужно будет избегать этого, добавив еще одну обратную косую черту.

Если файл еще не создан, функция filesize() укажет на False и ошибку. Поэтому вначале проверяют файл на существование нужной команды file_exists().

Проверку file_exists() нужно включать практически всегда для безопасности.

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

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

Функции для работы с файлами PHP облегчают задачу. В данном случае понадобится file_get_contents(). Она будет считывать все содержимое файла в переменную без необходимости открывать или закрывать файл самостоятельно. Это удобно, когда объем записи относительно невелик, так как сразу считывать 1 ГБ данных в архив не всегда рационально в PHP. Работа с «.ini»-файлами и функцией file_get_contents() показана ниже.

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

Для работы с функцией fopen() необходимы два аргумента:

  • файл, который нужно открыть;
  • режим, используемый в этом случае является «r» для чтения.

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

С целью чтения из открытого файла по одной строке за раз, использовать можно функцию fgets().

";} while (!feof($file1)); fclose($file1);

Использование do-while-цикла является хорошим выбором, чтобы узнать заранее, сколько строк в файле. Функция feof() проверяет, достиг ли файл завершения, а цикл продолжается до тех пор, пока не будет достигнут конец условия файла. После окончания чтения используется функция fclose() для закрытия документа.

Запись файлов

Два часто используемых режима при записи в файл с использованием функции fwrite(): «w» и «a». «W» означает, что нужно записать в документ, но он предварительно удалит любое содержимое, «a» - добавление новых данные к тому, что уже существует в файле. Нужно быть уверенным, что используется правильный вариант.

В следующем примере будет использоваться режим «a» для записи.

Сначала имя файла назначается переменной, затем он открывается в режиме «a» для добавления. Данные, которые должны быть записаны, назначаются переменной $output и fwrite(), а информация добавляется в файл. Процесс повторяется, чтобы добавить еще одну строку, затем документ закрывается с использованием fclose().

Предварительно определенная константа PHP_EOL добавляет символ новой строки, специфичный для платформы, на которой работает PHP с текстовыми файлами.

Содержимое файла после выполнения вышеуказанного кода должно выглядеть следующим образом:

  • банан;
  • Китай.

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

Вот такой же пример, как и выше, но на этот раз используется file_put_contents().

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

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

Чтобы создать файл на php в исполняемом скрипте надо всего лишь указать несколько функций:

Рассмотрим сразу пример:

$text = "Какой-то тут текст для записи в файл";
$fp = fopen("file.txt", "w");
fwrite($fp, $text);
fclose($fp);
?>

Тут вы должны знать :

fopen() - функция открывает файл чтения или для записи и уточнениями;

Это уточнения (параметр mode функции fopen) очень важно:

  • "r " - открыть файл в php ТОЛЬКО для чтения . Курсор помещается в начало.
  • "r+ " - открыть файл в php для чтения и для записи . Курсор помещается в начало. !!! - при этих двух режимах r и r+ файлы уже должны быть созданы(иначе вылезет ошибка Warning: fopen(file.txt) : failed to open stream: No such file or directory in ... ), а мы лишь читаем или у нас есть возможность дописывать.
  • "w " - открывается файл ТОЛЬКО для записи. Файл урезается до нулевой длины - то есть затирается. Записывается, что нужно и Курсор ставится в начало.
  • "w+ " - открывается файл для записи И ЧТЕНИЯ! Остальное то же самое что и в режиме "w". !!! - при этих двух режимах - если файл не был создан - ПРЕДПРИМЕТСЯ ПОПЫТКА ЕГО СОЗДАТЬ!
  • "a " - открыть файл ТОЛЬКО для записи. В отличие от "w" этот параметр не затирает содержимое файла, а ставит курсор в конец строки и добавляет в конец содержимое, которое мы хотели добавить.
  • "a+ " - открыть файл для записи и чтения.

fwrite ($fp, $text) - функция записи в файл на php - то есть то что находится в переменной $text записывается в файл, который находится в переменной $fp;

fclose ($fp) - функция закрытия файла, который мы записали в переменную $fp;

Все теперь вы спокойно можете создавать правильно файлы на php, открывать их для чтения и редактирования.

Полезные дополнения и функции PHP для работы с открытым файлом:

while(!feof($fp)){
$mytext = fgets($fp, 99);
echo $mytext."
";
}

здесь выполняется условие - "пока не достигнут конец файла то делай то то" while(!feof($fp))

1. Функция fgets ($fp, 99) - позволяет разделить все содержимое на участки в 99 байт и далее, чтобы это отчетливее увидеть мы помещаем тег

Эта функция string fgets (resource handle [, int length]) по умолчанию принимает в параметр length 1024 байта(1 килобайт), если не указать так и будет. Этот параметр необязателен с PHP 4.2.0 (В случае ошибки возвращает FALSE)

Доп функции для открытия, записи и создания файла

Функция - int readfile (string filename [, bool use_include_path [, resource context]]) - считываем файл как единое целое.

Читает файл и записывает содержимое в буфер вывода. И возвращает количество выведенных байт. В случае ошибки вернет, если не использована собачка - @readfile.

Что-то подобное получится:

В конце слова тег стоят
.

б. Функция - array file (string filename [, int use_include_path [, resource context]]), делает то же самое, что и функция readfile, за одним исключением она добавляет содержимое файла в массив:

Таким образом можно считывать любые странички в интернете: $lines = file("http://сайт/"); и перебрать массив через функцию foreach;

3а. Функция string file_get_contents (string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]]) - позволяет получить содержимое в виде одной строки.

Это более универсальная функция PHP для считывания файла, похожа на функцию file, только содержимое возвращается в строку, а не в массив и можно задавать условия - с какого байта начинать - offset и с какого заканчивать - maxlen . При неудаче вернет FALSE.

Важно!!! - в этом случае функция заменяет сразу 3: fopen(), fread() и fclose() и таким образом избавляет от мароки.

3б. Функция int file_put_contents (string filename, mixed data [, int flags [, resource context]]) - идентична последовательному вызову функций fopen(), fwrite() и fclose() - возвращает количество записанных байт.

file_put_contents — Пишет строку в файл

Описание

Int file_put_contents (string $filename , mixed $data [, int $flags = 0 [, resource $context ]])

Функция идентична последовательным успешным вызовам функций fopen() , fwrite() и fclose() .

Если filename не существует, файл будет создан. Иначе, существующий файл будет перезаписан, за исключением случая, если указан флаг FILE_APPEND .

Список параметров

Путь к записываемому файлу.

Записываемые данные. Может быть string , array или ресурсом stream .

Если data является ресурсом stream , оставшийся буфер этого потока будет скопирован в указанный файл. Это похоже на использование функции stream_copy_to_stream() .

Также вы можете передать одномерный массив в качестве параметра data . Это будет эквивалентно вызову file_put_contents($filename, implode("", $array)) .

Значением параметра flags может быть любая комбинация следующих флагов, соединенных бинарным оператором ИЛИ (| ).

context

Корректный ресурс контекста, созданный с помощью функции stream_context_create() .

Возвращаемые значения

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

Внимание

Эта функция может возвращать как boolean FALSE , так и не-boolean значение, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример простого использования

$file = "people.txt" ;
// Открываем файл для получения существующего содержимого
$current = file_get_contents ($file );
// Добавляем нового человека в файл
$current .= "John Smith\n" ;
// Пишем содержимое обратно в файл
file_put_contents ($file , $current );
?>

Пример #2 Использование флагов

$file = "people.txt" ;
// Новый человек, которого нужно добавить в файл
$person = "John Smith\n" ;
// Пишем содержимое в файл,
// используя флаг FILE_APPEND flag для дописывания содержимого в конец файла
// и флаг LOCK_EX для предотвращения записи данного файла кем-нибудь другим в данное время
file_put_contents ($file , $person , FILE_APPEND | LOCK_EX );
?>