Работа с файлами и директориями в PHP 7
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"]); }