PHP позволяет работать с файлами и каталогами. В данной заметке кратко о файловой системе, разберём основные функции для работы с файлами (открытие, запись, чтение) и директориями, хранящимися на веб-сервере.

Полезные функции

// Проверка файлов и директорий на существование
if( file_exists("file.txt") ){
  echo "Файл или директория существует";
}

// Проверка файлов на существование
if( is_file("file.txt") ){
 echo "Файл существует";
}

// Проверка директорий на существование
if( is_dir("images") ){
  echo "Директория существует";
}

// Размер файла
echo "Длина файла file.txt: " .filesize("file.txt");

// Время изменения и доступа к файлу
echo "Файл file.txt был изменён: " . filemtime("file.txt");
echo "и запрошен: " . fileatime("file.txt");

// Что можно с файлом делать?
if( is_readable("file.txt") ){
  echo "Файл можно читать";
}

if( is_writable("file.txt") ){
  echo "В файл можно писать";
}

if( is_executable("file.exe") ){
  echo "Файл можно исполнять";
}

Работа с потоком

// Открытие потока на чтение и получение его дескриптора
$f = fopen("file.txt", "r") or die("Не могу открыть файл!");

// Закрытие потока
fclose($f);

// Открытие потока на чтение и запись
$f = fopen("file.txt", "r+");
// Открытие потока на запись. Указатель помещается в конец файла
$f = fopen("file.txt", "a");
// Открытие потока на чтение и запись. Указатель помещается в конец файла
$f = fopen("file.txt", "a+");
// Открытие потока на запись. Файл обрезается до нулевой длины
$f = fopen("file.txt", "w");
// Открытие потока на чтение и запись. Файл обрезается до нулевой длины
$f = fopen("file.txt", "w+");

// Читаем файл кусками
$f = fopen("file.txt", "r");
// Читаем первые 5 байт из потока
echo fread($f, 5);
// Читаем следующие 3 байта из потока
echo fread($f, 3);
//Выводим всё с текущей позиции до конца
fpassthru($f);
fclose($f);

// Читаем файл построчно в массив
$f = fopen("file.txt", "r");
$lines = [];
while ( $line = fgets($f) ){
  $lines[] = $line;
}
fclose($f);

// Читаем файл построчно в массивы, вырезаем html-тэги, оставляя нужные
$f = fopen("file.html", "r");
$lines = [];
while ( $line = fgetss($f, 4096, "<p><br>") ){
	$lines[] = $line;
}
fclose($f);

// Читаем файл побайтово в массив
$f = fopen("file.txt", "r");
$bytes = [];
while ( !feof($f) ){
	$bytes[]= fgetc($f);
}
fclose($f);

// Пишем в файл
$f = fopen("file.txt", "r+");
fwrite($f, "Новый текст", 25);
fclose($f);

// Пишем в конец файла
$f = fopen("file.txt", "a");
fputs($f, "\nНовая строка");
fclose($f);

// Читаем последние 10 байт из потока
$f = fopen("file.txt", "r");
// Устанавливаем указатель в нужную позицию
fseek($f, -10, SEEK_END);
// В какой позиции мы находимся?
echo ftell($f);
// Читаем данные
echo fread($f, 10);
// Устанавливаем указатель в начало потока
rewind($f);
fclose($f);

Прямая работа с файлами

// Читаем весь файл напрямую в буфер вывода
readfile("file.txt");
// Что и
$f = fopen("file.txt", "r");
echo fread($f, filesize("file.txt"));
fclose($f);

// Читаем файл построчно в массив
$lines = file("file.txt");;
// Что и
$f = fopen("file.txt", "r");
while ( $lines[] = fgets($f) );
fclose($f);

// Получаем весь файл в виде строки
$file = file_get_contents("file.txt");
// Что и
$f = fopen("file.txt", "r");
$file = fread($f, filesize("file.txt"));
fclose($f);

// Пишем в файл затирая содержимое
file_put_contents("file.txt", "Новое содержимое");
// Что и
$f = fopen("file.txt", "w");
fputs($f, "Новое содержимое");
fclose($f);

// Пишем в файл добавляя содержимое в конец
file_put_contents("file.txt", "Новое содержимое", FILE_APPEND);
// Что и
$f = fopen("file.txt", "a");
fputs($f, "Новое содержимое");
fclose($f);

Управление файлами

// Копируем файл
copy("source.txt", "destination.txt");

// Переименовываем файл
rename("old.txt", "new.txt");

// Удаляем файл
unlink("file-to-delete.txt");

Работа с директориями

// Создание директории
mkdir("newdir");
// Удаление директории
rmdir("dir-to-delete");
// Имя текущей директории
echo getcwd();

// Заходим в текущую директорию
$dir = opendir(".");
// Читаем содержимое директории
while ( $name = readdir($dir) ){
	if(is_dir($name))
		echo '[' . $name . ']<br>';
	else
		echo $name . '<br>';
}
//Выходим из директории
closedir($dir);

// Читаем содержимое директории в массив
$dir_content = scandir(".");

// Читаем определённое содержимое директории в массив
$dir_txt_content = glob("*.txt");

Загрузка файлов на сервер

<?php
/*
* Настройки PHP.INI
* file_uploads = "1"
* upload_max_filesize = "2M"
* post_max_size = "8M"
* max_file_uploads = 20
* upload_tmp_dir =
* max_input_time = "-1"
*/
?>

<form enctype="multipart/form-data" method="POST" action="">
	<input type="hidden" name="MAX_FILE_SIZE" value="4096">
	<input name="userfile" type="file">
	<input type="submit">
</form>

<?php
if ( $_FILES["userfile"]["error"]!= UPLOAD_ERR_OK){
	switch($_FILES["userfile"]["error"]){
		case UPLOAD_ERR_INI_SIZE:
			echo "Превышен максимально допустимый размер"; break;
		case UPLOAD_ERR_FORM_SIZE:
			echo "Превышено значение MAX_FILE_SIZE"; break;
		case UPLOAD_ERR_PARTIAL:
			echo "Файл загружен частично"; break;
		case UPLOAD_ERR_NO_FILE:
			echo "Файл не был загружен"; break;
		case UPLOAD_ERR_NO_TMP_DIR:
			echo "Отсутствует временная папка"; break;
		case UPLOAD_ERR_CANT_WRITE:
			echo "Не удалось записать файл не диск";
	}
} else {
	echo "Размер загруженного файла: " . $_FILES["userfile"]["size"];
	echo "Тип загруженного файла: " . $_FILES["userfile"]["type"];
	move_uploaded_file($_FILES["userfile"]["tmp_name"], "upload/" . $_FILES["userfile"]["name"]);
}