Работа с файлами в PHP
Прочитав эту статью, вы узнаете, как создавать, получать доступ и управлять файлами на веб-сервере с помощью функции PHP fread и другими.
- Открытие файла с помощью функции PHP fopen()
- Закрытие файла
- Чтение из файлов с помощью функции PHP fread()
- Чтение фиксированного количества символов
- Чтение всего содержимого файла
- Запись файлов с использованием функции PHP fwrite()
- Переименование файлов с помощью функции PHP rename()
- Удаление файлов с помощью функции PHP unlink()
- Функции файловой системы PHP
Открытие файла с помощью функции PHP fopen()
Для работы с файлом сначала нужно его открыть функцией fopen(). Ее синтаксис:
fopen(имя_файла, режим)
Первый параметр, передаваемый в fopen(), это имя файла, который нужно открыть, а второй - режим открытия. Например:
<?php
$handle = fopen("data.txt", "r");
?>
Файл может быть открыт в одном из следующих режимов:
Режим | Что он делает |
R | Открывает файл только для чтения. |
r+ | Открывает файл для чтения и записи. |
W | Открывает файл только для записи и очищает содержимое файла. Если файл не существует, PHP попытается его создать. |
w+ | Открывает файл для чтения и записи и очищает содержимое файла. Если файл не существует, PHP попытается его создать. |
A | Открывает файл только для записи. Сохраняет содержимое файла, записывая его в конец файла. Если файл не существует, PHP попытается его создать. |
a+ | Открывает файл для чтения и записи. Сохраняет содержимое файла, записывая его в конец файла. Если файл не существует, он будет создан. Можно использовать вместо PHP fread () |
X | Открывает файл только для записи. Возвращает значение FALSE и генерирует ошибку, если файл уже существует. Если файл не существует, PHP попытается его создать. |
x+ | Открывает файл для чтения и записи; в противном случае имеет такое же поведение, как «x». |
Если вы попытаетесь открыть файл, который не существует, PHP сгенерирует сообщение с предупреждением. Чтобы избежать этого, необходимо выполнять простую проверку, существует ли файл или нет, прежде чем пытаться получить к нему доступ. Это делается с помощью функции PHP file_exists():
<?php
$file = "data.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Пытаемся открыть файл
$handle = fopen($file, "r");
} else{
echo "ERROR: File does not exist.";
}
?>
Совет. Операции с файлами и папками часто сопряжены с ошибками. Поэтому рекомендуется применить форму проверки ошибок, чтобы при их возникновении скрипт обработал ошибку.
Закрытие файла
Как только вы закончите чтение файла с помощью PHP fread, его нужно закрыть. Для этого используется функция fclose():
<?php
$file = "data.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Открываем файл для чтения
$handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
/* Некоторый выполняемый код */
// Обработка закрытия файла
fclose($handle);
} else{
echo "ERROR: File does not exist.";
}
?>
Примечание. Хотя PHP автоматически закрывает все открытые файлы, когда скрипт завершается, рекомендуется закрыть файл после выполнения всех операций.
Чтение из файлов с помощью функции PHP fread()
Теперь вы знаете, как открывать и закрывать файлы. В следующем разделе вы узнаете, как читать данные из файла. PHP включает в себя сразу несколько функций для чтения данных из файла. За одну операцию можно считать, как один символ, так и весь файл.
Чтение фиксированного количества символов
Функция PHP fread() может использоваться для чтения заданного количества символов из файла. Базовый синтаксис функции:
fread(дескриптор_файла, длина_в_байтах)
Она принимает два параметра - дескриптор файла и количество байтов, которые должны быть считаны. В следующем примере мы считываем 20 байтов из файла data.txt, включая пробелы. Предположим, data.txt содержит абзац текста "The quick brown fox jumps over the lazy dog":
<?php
$file = "data.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Открываем файл для чтения
$handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
// Считываем фиксированное количество байтов из файла
$content = fread($handle, "20");
// Обработка закрытия файла
fclose($handle);
// Выводим содержимое файла
echo $content;
} else{
echo "ERROR: File does not exist.";
}
?>
Приведенный выше пример даст следующий результат:
The quick brown fox
Чтение всего содержимого файла
Функция fread() может использоваться в связке с функцией filesize() для полного считывания всего файла. filesize() возвращает размер файла в байтах. PHP fread пример:
<?php
$file = "data.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Открываем файл для чтения
$handle = fopen($file, "r") or die("ERROR: Cannot open the file.");
// Считываем весь файл
$content = fread($handle, filesize($file));
// Обработка закрытия файла
fclose($handle);
// Выводим содержимое файла
echo $content;
} else{
echo "ERROR: File does not exist.";
}
?>
Приведенный выше пример даст следующий результат:
The quick brown fox jumps over the lazy dog.
Самый простой способ прочитать все содержимое файла - это функция readfile(). Она позволяет считать содержимое файла, не открывая его. Следующий пример даст тот же результат, что и предыдущий пример:
<?php
$file = "data.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Считывает и выводит весь файл
readfile($file) or die("ERROR: Cannot open the file.");
} else{
echo "ERROR: File does not exist.";
}
?>
Приведенный выше пример даст следующий результат:
The quick brown fox jumps over the lazy dog.
Другой способ прочитать все содержимое файла, не открывая его - это функция file_get_contents(). Она принимает имя и путь к файлу и считывает весь файл в строковую переменную. Пример без PHP fread:
<?php
$file = "data.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Считываем весь файл в строку
$content = file_get_contents($file) or die("ERROR: Cannot open the file.");
// Выводим содержимое файла
echo $content;
} else{
echo "ERROR: File does not exist.";
}
?>
Еще один способ считывания всех данных из файла - это функция file(). Она работает аналогично функции file_get_contents(), но возвращает содержимое как массив строк, а не одну строку. Каждый элемент возвращаемого массива соответствует строке в файле.
Чтобы обработать данные файла, необходимо выполнить обработку массива через цикл foreach. В следующем примере, мы считываем файл в массив и затем отображаем его с помощью цикла:
<?php
$file = "data.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Считываем весь файл в массив
$arr = file($file) or die("ERROR: Cannot open the file.");
foreach($arr as $line){
echo $line;
}
} else{
echo "ERROR: File does not exist.";
}
?>
Запись файлов с использованием функции PHP fwrite()
Можно записать данные в файл с помощью функции PHP fwrite(). Ее синтаксис:
fwrite(дескриптор_файла, строка)
Функция fwrite() принимает два параметра: дескриптор файла и строку данных, которые должны быть записаны:
<?php
$file = "note.txt";
// Строка данных, которую нужно записать
$data = "The quick brown fox jumps over the lazy dog.";
// Открываем файл для записи
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");
// Записываем данные в файл
fwrite($handle, $data) or die ("ERROR: Cannot write the file.");
// Обработка закрытия файла
fclose($handle);
echo "Data written to the file successfully.";
?>
В приведенном выше примере, если файл note.txt не существует, PHP автоматически создаст его и запишет данные. Но если note.txt уже существует, PHP перед записью новых данных стирает содержимое этого файла. Если вы просто хотите добавить файл и сохранить существующее содержимое, используйте режим a вместо w.
Альтернативный способ – file_put_contents(). Это аналог функции file_get_contents(), который предоставляет простой способ записи данных в файл без необходимости его открытия. Эта функция принимает имя и путь к файлу с данными, которые должны быть записаны. Например (похожий на PHP fread пример):
<?php
$file = "note.txt";
// Строка данных, которые нужно записать
$data = "The quick brown fox jumps over the lazy dog.";
// Записываем данные в файл
file_put_contents($file, $data) or die("ERROR: Cannot write the file.");
echo "Data written to the file successfully.";
?>
Если файл, указанный в функции file_put_contents(), уже существует, PHP по умолчанию перезапишет его. Если вы хотите сохранить содержимое файла, можно передать специальный флаг FILE_APPEND в качестве третьего параметра file_put_contents(). Тогда функция добавит новые данные в файл, а не перепишет их. Пример:
<?php
$file = "note.txt";
// Строка данных, которую нужно записать
$data = "The quick brown fox jumps over the lazy dog.";
// Записываем данные в файл
file_put_contents($file, $data, FILE_APPEND) or die("ERROR: Cannot write the file.");
echo "Data written to the file successfully.";
?>
Переименование файлов с помощью функции PHP rename()
После прочтения с помощью php fread() файл можно переименовать файл или каталог, используя функцию PHP rename(), например:
<?php
$file = "file.txt";
// Проверяем наличие файда
if(file_exists($file)){
// Пытаемся переименовать файл
if(rename($file, "newfile.txt")){
echo "File renamed successfully.";
} else{
echo "ERROR: File cannot be renamed.";
}
} else{
echo "ERROR: File does not exist.";
}
?>
Удаление файлов с помощью функции PHP unlink()
Можно удалять файлы или папки с помощью функции PHP unlink(), например:
<?php
$file = "note.txt";
// Проверяем наличие файла
if(file_exists($file)){
// Попытка переименования файла
if(unlink($file)){
echo "File removed successfully.";
} else{
echo "ERROR: File cannot be removed.";
}
} else{
echo "ERROR: File does not exist.";
}
?>
Функции файловой системы PHP
В приведенной ниже таблице представлен обзор других полезных функций, которые можно использовать для динамического чтения и записи файлов (альтернатива PHP fread() и другим функциям):
Функция | Описание |
fgetc() | Считывает один символ за раз. |
fgets() | Считывает одну строку за раз. |
fgetcsv() | Считывает строку разделенных запятыми значений. |
filetype() | Возвращает тип файла. |
feof() | Проверяет, достигнут ли конец файла. |
is_file() | Проверяет, является ли файл стандартным файлом. |
is_dir() | Проверяет, является ли файл каталогом. |
is_executable() | Проверяет, является ли файл исполняемым. |
realpath() | Возвращает канонизированный абсолютный путь к файлу. |
rmdir() | Удаляет пустую директорию. |