Php построчное чтение файла в массив. Работа с файлами в PHP. Чтение файла, запись в файл. PHP учебник. Удаление файлов, изменение chmod, работа с каталогами. C. Чтение файлов в PHP

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

Чтение из файла

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

fread (файл, длина)

Параметры:

файл - дескриптор файла

длина - размер данных в байтах

Если конец файла будет достигнут раньше, чем функция прочитает указанный размер данных, то она вернёт строку меньшего размера. Данную функцию удобно применять для чтения бинарных файлов.

При указании длины строки и при перемещении указателя нужно учитывать, что русские буквы имеют размер не один байт, а больше. в теме "Работа со строками". Также не забудте, что в начале файла в кодировке UTF-8 есть несколько байт. В кодировке UTF-8 без BOM эти байты отсутствуют.

Прочитаем перыве 10 байт из файла myfile.txt. Откроем его в режиме "r+". Указатель будет находится в начале.

$file = fopen("myfile.txt", "r+"); $take = fread($file, 10); echo $take;

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

Функция fgets() возвращает одну строку, начиная от указателя до конца строки.

fgets (файл, длина)

Параметры:

файл - дескриптор файла

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

Если длина не указана, то в старых версиях PHP максимальная длина возвращаемой строки была ограничена. В более новых версиях этого ограничения нет.

Запуск функции в цикле позволяет произвести чтение файла построчно.

Прочитаем одну строку строку из файла myfile.txt. Так как указатель уже перемещён, то будет прочитана не вся строка, а от указателя.

$take = fgets($file); echo "
".$take;

Функция fgetss() также возвращает одну строку, но удаляет из неё HTML теги. Если в коде присутствует PHP скрипт, то он тоже будет удалён.

fgetss (файл, длина, нужные тэги)

Параметры:

файл - дескриптор файла

длина - размер строки в байтах. Необязательный параметр.

нужные теги - позволяет указать тэги, которые не будут удалены.

Существует функция fgetc() , которая возвращает один символ из файла.

Функция file() читает весь файл и помещает данные в массив. Каждая строка помещается в элемент массива. Для работы этой функции не требуется открывать файл. Расположение указателя не учитывается.

file (путь к файлу, флаги, контекст)

Параметры:

путь к файлу - абсолютный или относительный путь к файлу

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

контекст - позволяет указать ресурс контекста

Можно указать такие флаги:

FILE_USE_INCLUDE_PATH - позволяет искать файл в папках include path.

FILE_IGNORE_NEW_LINES - удаляет символ конца строки. Если этот флаг не установлен, то в каждой строке будет символ конца строки.

FILE_SKIP_EMPTY_LINES - не добавляет в массив пустые строки.

Если указывается несколько флагов, то они разделяются оператором "|".

Выведем файл myfile.txt на страницу.

$ar = file("myfile.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); echo "
"; print_r($ar);

Запись в файл

Функция fwrite() записывает данные в файл.

fwrite (файл, данные, длина)

Параметры:

файл - дескриптор файла

данные - данные, которые записываются

длина - максимальный размер записываемых данных в байтах. Может быть записана не вся строка, а только указанное количество байт. Необязательный параметр.

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

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

Запишем в файл строку "текст из скрипта". В нашем примере дескрептор находится в середине файла и строка запишется туда. Когда нужно добавить данные в конец файла, то его можно открыть в режиме "a". А когда нужно перезаписать файл, его открывают в режиме "w". Мы не будем передвигать указатель, запишем данные туда, где он находится.

$text = "текст из скрипта"; fwrite($file, $text);

В предыдущем уроке мы научились использовать РНР для доступа к файловой системе сервера. В этом уроке используем эту информацию для чтения из простого текстового файла.

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

Открыть текстовый файл

Для открытия текстового файла используем функцию fopen . Вот её синтаксис:

Fopen(filename, mode )

Filename Имя открываемого файла. mode Mode/Режим может быть "r" (reading/чтение), "w" (writing/запись) или "a" (appending/присоединение). В этом уроке мы будем только читать из файла и, соответственно, используем "r". В следующем уроке мы научимся записывать и присоединять текст.

Примеры этого урока используют файл unitednations.txt . Это простой список программ и фондов ООН и их доменов. Можете загрузить этот файл или создать свой и использовать его в примерах.

Сначала попробуем открыть unitednations.txt:

// Открыть текстовый файл // Закрыть текстовый файл fclose($f); ?>

Пример 1: Чтение строки из текстового файла

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

Для получения информации из каждой строки используем массив. См. в Уроке 8 о массивах.

Чтение из текстовых файлов $f = fopen("unitednations.txt", "r"); // Читать построчно до конца файла while (!feof($f)) { // Создать массив с запятой-разделителем $arrM = explode(",",fgets($f)); // Записать ссылки (получить данные из массива) echo "

  • " . $arrM. "
  • "; } fclose($f); ?>

    Весьма удобно, правда? В принципе вы можете расширить этот файл сотнями ссылок или расширить директорию, включив также адреса.

    В следующем уроке мы мы посмотрим, как записать в текстовый файл.

    Последнее обновление: 1.11.2015

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

    Чтение и запись файлов

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

    Для открытия файлов в PHP определена функция fopen() . Она имеет следующее определение: resource fopen(string $filename, string $mode) . Первый параметр $filename представляет путь к файлу, а второй - режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:

      "r" : файл открывается только для чтения. Если файла не существует, возвращает false

      "r+" : файл открывается только для чтения с возможностью записи. Если файла не существует, возвращает false

      "w" : файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет - то он создается

      "w+" : файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет - то он создается

      "a" : файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается

      "a+" : файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается

    Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.

    После окончания работы файл надо закрыть с помощью функции fclose() , которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:

    $fd = fopen("form.php", "r") or die("не удалось открыть файл"); fclose($fd);

    Конструкция or die("текст ошибки") позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen не смогла открыть файл.

    Чтение файла

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

    При каждом вызове fgets() PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция feof() , которая возвращает true при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию fgets().

    Чтение файла полностью

    При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.

    Поблочное считывание

    Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread() :

    Функция fread() принимает два параметра: дескриптор считываемого файла и количество считываемых байтов. При считывании блока указатель в файле становится в конец этого блока. И также с помощью функции feof() можно отследить завершение файла.

    Запись файла

    Для записи файла применяется функция fwrite() , которая записывает в файл строку:

    Аналогично работает другая функция fputs() :

    Работа с указателем файла

    При открытии файла для чтения или записи в режиме "w", указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek , которая имеет следующее формальное определение:

    Int fseek (resource $handle , int $offset [, int $whence = SEEK_SET ])

    Параметр $handle представляет дескриптор файла. Параметр $offset - смещение в байтах относительно начала файла, с которого начнется считывание/запись. Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:

      SEEK_SET : значение по умолчанию, устанавливает смещение в offset байт относительно начала файла

      SEEK_CUR : устанавливает смещение в offset байт относительно начала текущей позиции в файле

      SEEK_END : устанавливает смещение в offset байт от конца файла

    В случае удачной установки указателя функция fseek() возвращает 0, а при неудачной установке возвращает -1.

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

    $fd = fopen("hello.txt", "w+") or die("не удалось открыть файл"); $str = "Привет мир!"; // строка для записи fwrite($fd, $str); // запишем строку в начало fseek($fd, 0); // поместим указатель файла в начало fwrite($fd, "Хрю"); // запишем в начало строку fseek($fd, 0, SEEK_END); // поместим указатель в конец fwrite($fd, $str); // запишем в конце еще одну строку fclose($fd);

    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 часто приходится иметь дело с созданием файла...все очень просто нет файла на диске, код прогнался и файл появился, далее можно считать этот файл в другую переменную или даже любую страницу в интернете и потом что-нибудь туда записать...но для этого надо знать спец функции...об этом в этой статье...

    Чтобы создать файл на 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() - возвращает количество записанных байт.

    Публикации по теме