Чтение файлов и директорий в php-сценарии

Сначала - выбор пути к файлу или директории, затем - чтение из директории и/или чтение из файла.

Путь к файлу

Абсолютный путь - это полный путь к файлу от корневой директории (папки) в файловой системе.
В Windows абсолютный путь к файлу в начинается с имени диска (например, "C:\Users\user1\Documents\html\file1.html"), абсолютный путь к файлу страницы с веб-адресом http://mysite.ru/file1.php, которая находится на Unix-сервере (Apache), имеет вид, например

"/home/userlogin/public_html/mysite.ru/file.php"

где userlogin - логин пользователя на сервере.

Слеш (/) обозначает корневую директорию.

Путь к директории, которая является корневой для веб-сайта, задается в конфигурации сервера и содержится в системной php-переменной

$_SERVER['DOCUMENT_ROOT']

В данном случае это ""/home/userlogin/public_html/mysite.ru"".

"/myplugin/file2.php" полный путь от корня сайта (адрес соответствующей веб-страницы - "http://site.ru/myplugin/file2.php")

Это значит, что в ссылках на локальные страницы сайта можно указывать только путь от корня сайта (без протокола и домена) "/myplugin/file2.php".
Относительный путь - это путь относительно документа, в котором используется ссылка на файл.

Например, пусть в папке сайта "myplugin" есть файл file2.php и папка "images", в которой находится файл "image1.jpg". Путь к файлу изображения из файла file2.php: "images/image1.jpg".

Но если в начале этого пути добавить слеш (/) , т.е. написать "/images/image1.jpg", это будет путь к другому файлу, который находится в другой папке "images" в корне сайта mysite.ru (см. рисунок).

Чтобы подняться на директорию вверх, нужно написать"../".

Например, в файле file2.php можно указать на файл файл file1.php (в корневой папке сайта) как на файл в родительской директории "../file1.php" или в корневой директории "/file1.php".

"/tmp/file.html" полный путь от корня сайта (соответствующий веб-адрес "http://site.ru//tmp/file.html")
"tmp/data/" путь относительно текущей директории ("data" - поддиректория директории "tmp")
"./images/" поддиректория текущей директории
"file.php" файл в текущей директории
"./file.php" файл в текущей директории
"../" родительская директория
"../file.php" файл в родительской директории
"../../file.php" файл в директории, который на два уровня выше текущей директории

Функции для работы с именами файлов и директорий

bool file_exists(string $name) проверяет, существование файла или директории с заданным именем
if ( !file_exists("file.txt") ) exit("Файл не существует");
string basename(string $path) возвращает имя файла из полного пути (т.е. имя файла без пути)
string dirname(string $path) возвращает имя директории из полного пути; для текущего файла: dirname(__FILE__)
array pathinfo (string path [, int options]) возвращает ассоциативный массив, который содержит элементы пути path: dirname, basename и extension.
options позволяет задать, какие элементы будут возвращены: PATHINFO_DIRNAME, PATHINFO_BASENAME и PATHINFO_EXTENSION.
string realpath(string $path) преобразует относительный путь в абсолютный, например, в сценарии, расположенном в корневой директории:
echo realpath("file1.php"); // выведет /home/userlogin/public_html/mysite.ru/file1.php
string tempname(string $dir, string $prefix) генерирует (уникальное) имя временного файла
is_readable($path) проверяет возможность чтения файла или директории***
bool is_dir(string $path) возвращает TRUE, если $path - это путь к существующей директории ***.
bool is_file ( string $path ) возвращает TRUE, если $path - это путь к существующему файлу (результат кэшируется***).
string getcwd (void) возвращает текущую директорию (например, "/home/userlogin/public_html/mysite.ru/myplugin")
int chdir( string $dir ) изменяет текущую директорию (переходит в заданную директорию)
boolean chroot (string $path) изменяет корневую директорию

*** Результаты функций, возвращающих информацию о состоянии файлов, кэшируются. Это функции stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype() и fileperms().
Если во время выполнения php-скрипта состояние файла может изменяться, и это нужно проверять, следует очищать кэш. Это делает функция clearstatcache();

Чтение директории

Если прочитать все элементы внутри директории, в списке результатов окажутся элементы "." (текущая директория) и ".." (родительская директория) , что следует учитывать при обработке прочитанных элементов директории.

<?php
if ($handle = opendir('.')) { // открыта текущая директория
  while (false !== ($file = readdir($handle)))   {
    if ($file != "." && $file != "..")
    {
      echo "$file" . "<br/>";
    }
  }
  closedir($handle);
}
?>
resourse opendir (string $path) открывает директорию, например, текущую директорию можно открыть так:
opendir('.');
string readdir (resource $handle) Возвращает имя следующего по порядку элемента директории, для которого создан дескриптор $handle (порядок следования элементов зависит от файловой системы).
void rewinddir (resource $handle) сбрасывает дескриптор директории $handle (чтобы он указывал на начало директории)
void closedir ($handle) закрывает директорию

Чтение директории без создания дискриптора:

array scandir (string $path [, int order]) возвращает массив файлов и директорий из заданной директории, если директория не найдена, возвращает FALSE и генерирует сообщение об ошибке уровня E_WARNING.
По умолчанию элементы сортируются в алфавитном порядке, а если необязательный параметр order равен 1, - по убыванию.
array glob ( string pattern [, int flags] ) возвращает массив файлов и директорий, пути к которым соответствуют заданному шаблону pattern, а в случае ошибки возвращает FALSE.
флаги:
GLOB_MARK - добавляет слеш к каждому возвращаемому пути
GLOB_NOSORT - возвращает файлы без сортировки
GLOB_NOCHECK - возвращает шаблон , если не был найден ни один файл.
GLOB_NOESCAPE - обратные слеши не экранируют метасимволы
GLOB_BRACE - раскрывает {a,b,c} для совпадения с 'a', 'b' или 'c'
GLOB_ONLYDIR - возвращает только катологи

Все файлы с расширением ".txt" из папки "texts" в корневой папке сайта:

foreach (glob("/texts/*.txt") as $v){
 $fname=basename($v);
 echo($fname. "<br>");
}

Продолжение - о чтении данных из файла - в следующей статье, которая называется
"Чтение файлов и директорий в php-сценарии, продолжение: файлы".

1 thought on “Чтение файлов и директорий в php-сценарии

  1. Иван

    Да есть плагин Wp-editor для этих целей. Весьма функциональный.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *