Работа с файлами — важный момент. Так как в них можно хранить данные, логи и т.д. Загружать файлы на сервер мы уже умеем. А теперь нужно научиться взаимодействовать с их содержимым.
Сам процесс работы с файлом разделяется на три этапа:
1. Открытие файла.
2. Работа над содержимым открытого файла.
3. Закрытие файла.
У функции 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, и я просто применяю синтаксический анализатор».
Итак, вот несколько причин, по которым могут понадобиться файлы:
- Чтобы переместить двоичные данные (например, файлы изображений) в базу данных BLOB (двоичные большие объекты).
- Импорт данных (например, адресов электронной почты), экспортированных из устаревшей базы данных или приложения.
- Чтобы из базы данных экспортировать информацию в текстовый файл для обработки в автономном режиме.
Чтение файлов и запись - это основные операции. Если нужно прочитать документ, то сначала требуется его открыть. После этого следует прочесть как можно больше содержимого, затем закрыть файл. Для записи информации в документ, нужно его вначале открыть (или, возможно, создать, если он еще не создан). После этого записывают необходимые данные и закрывают его по завершении.
Удобно использовать и встроенные функции, которые автоматически совершают открытие и закрытии. Они доступны в 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
);
?>