Путь к файлу в файловой системе

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Путь к файлу (path to file) — набор символов, показывающий расположение файла в файловой системе, адрес каталога.

Путь к файлу в web

В Web’е имеется своя специфика определения путей файлов/каталогов. Корнем считается домен сайта от которого и отсчитываются адреса. Выше этого корня выйти никак нельзя.

Многие браузеры парсят url и сразу высчитывают реальный путь, убирая ссылки на каталоги вида «.» — текущий каталог и «..» — родительский каталог. Только после этого они делают реальные http запросы к серверам. При разборе ссылок на каталоги может получиться так, что путь указывает на родительский каталог директории сайта. Поскольку домен сайта является корнем, то ссылки на каталоги ведущие за его пределы будут отброшены. То есть в пути к файлу можно указать сколько угодно ссылок на родительские каталоги вида «/../../../» однако как только парсер пути сервера или браузера достигнет корня (сайта), то дальнейшие подобные ссылки на каталоги будут отброшены. Так пути на файлы в web разбирают как сами браузеры, так и web-серверы.

При указании адресов в соответствующих HTML атрибутах полный путь должен обязательно содержать в себе протокол передачи данных. Любой путь без указания протокола (даже с указанием сайта) трактуется как относительный (локальный).

Абсолютные и относительные пути

Имеются некоторые различие между абсолютными и относительными путями в файловой системе и на сайте, то есть в web.

Сайт существует как бы в двух измерениях — реальном и виртуальном. Для всех посетителей — это виртуальный веб-сервер, который отличается, в числе прочего, тем, что на нем не существует файлов. Если пользователь пишет путь http://site.loc/file.html — это не файл, это URI, виртуальный адрес. Никакого файла с именем «file.html» на сервере может вообще не быть. Это все виртуальные адреса, а не файлы. И браузер работает именно с адресами.

Для разработчика же сайт это программа, выполняющаяся на совершенно конкретном реальном компьютере. С совершенно конкретным жестким диском, каталогами и файлами. И скрипт, работая со своими данными, подгружая другие скрипты, работает именно с реальными файлами, на физическом диске. В этом различии и кроются трудности, с которыми часто сталкиваются новички: теряют файлы, путают ссылки с файлами, обращаются к локальным файлам по протоколу HTTP, или инклюдят файлы от корня веб-сервера. А всего-то надо четко понимать две вещи:

  1. Различать корень веб-сервера, как его видит браузер, и корень файловой системы на диске.
  2. Отличие относительных путей от абсолютных.

Начнем со второго. Это очень просто. Если путь указывается от корня системы, то это путь абсолютный. Это как почтовый адрес в реальной жизни — откуда бы ты не шёл, но по точному адресу ты всегда точно найдешь нужное место.

Примеры абсолютных путей:

/var/www/site/forum/index.php
/img/frame.gif
с:\windows\command.com

В UNIX системах и на веб сайтах корень обозначается косой чертой «/». Это важно. Это не просто палочка, а самостоятельный адрес, путь. В адресе http://www.site.loc/ последняя косая черта не для красоты. Она обозначает вполне конкретный адрес — начало сайта. На диске в UNIX системах также можно набрать «cd /» и попадешь в корневой каталог.

В MS Windows системах файловая система разбивается по дискам. Поэтому в абсолютном адресе надо указывать имя диска. Абсолютного корня всей файловой системы в MS Windows нет, у каждого диска — свой. Например, C:\, E:\. Поэтому, даже если путь в MS Windows начинается с косой черты, то это не абсолютный путь, а относительный, относительно текущего диска, а абсолютный начинается с буквы.

Если в начале пути корень не указать, то этот путь будет относительным, и он достаивается от текущего положения. В реальной жизни это напоминает дорогу к магазину — «два квартала налево и там все время прямо». Дойти по такому пути можно только из конкретной точки. Из другой попадешь уже в совсем другое место.

Самый простой пример относительного пути — это просто имя файла. Если файл находится в том же каталоге, с которым работает программа, то она его найдет, добавив текущий путь к имени файла. Примеры относительных путей:

  • file.php — файл лежит в той же папке.
  • ./file.php — файл лежит в той же папке. Такая точная запись иногда требуется в некоторых UNIX системах.
  • images/picture.jpg — файл лежит в капке images, которая находится в текущей.
  • ../file.php — файл лежит в папке, которая расположена на один уровень выше от текущей.
  • ../../file.php — файл лежит в папке, которая расположена на два уровня выше от текущей.

И операционная система, и браузер, встретив относительный путь, достраивают его до абсолютного, но каждый — по-своему.

Теперь перейдём к первому пункту. Различие корня веб-сервера, как его видит браузер, и корень файловой системы на диске. В общем-то, из предыдущих объяснений уже все должно быть понятно. На диске путь к файлу скрипта может быть таким: /var/www/site/forum/index.php. В то же время, виртуальный адрес этого скрипта при просмотре через браузер, будет: http://www.site.loc/forum/index.php. На этом примере легко увидеть, где пересекаются два измерения: у этих двух адресов есть общая часть — /forum/index.php, и она-то и служит причиной путаницы. Для браузера это самый полный путь, который только может быть. Он начинается от корня сайта. Для скрипта же, исполняющегося на сервере — это всего лишь часть пути. Для скрипта путь /forum/index.php окажется несуществующим — в корне диска нет каталога forum! Чтобы получить полный путь для того, что на сайте выглядит, как /forum/index.php, надо приставить слева к нему путь к папке, которая считается корневаой для всего веб-сервера. В нашем примере — это /var/www/site. Этот путь задается в кофигурации веб-сервера и именно он содержится в системной переменной PHP $_SERVER['DOCUMENT_ROOT']. В виртуальном же сервере, то есть том, который видит пользователь — наоборот, нет никакого диска, а есть корень сайта. То есть, для того, чтобы любая ссылка гарантированно работала, независимо от того, из какого места сайта она вызывается, она должна быть абсолютной.

Если на сайте есть, допустим, два раздела: http://www.site.loc/about/info.php и http://www.site.loc/job/vacancy.php, то, если в файле info.php сделать ссылку просто на vacancy.php, то браузер её не найдет — он будет искать адрес http://www.site.loc/about/vacancy.php, достраивая путь от текущего каталога. Поэтому надо писать полный путь от корня сайта — /job/vacancy.php. Всё это касается, естественно, не только тегов <a>, но и <img>, и любых других, где используются ссылки на другие файлы.

Ссылки на локальные адреса следует писать без указания протокола и домена — только путь от корня сайта /job/vacancy.php. Ссылки же на другие сайты следует писать полностью — http://www.site1.loc/job/vacancy.php.

PHP предоставляет множество средств для работы с файлами, каталогами и URL-ами. Во-первых, это многочисленные предопределённые переменные, которые описаны в документации, и значения которых в своём скрипте можно посмотрев с помощью phpinfo(): Константа __FILE__ содержит имя текущего исполняемого файла. В отличие от PHP_SELF, она содержит имя файла, исполяющегося в данный момент. Очень полезной представляется конструкция dirname(__FILE__), на которую желательно заменить все вызовы файлов, лежащих в том же каталоге, что и вызывающий скрипт. Например: require dirname(__FILE__) . "/init.php";. Функция dirname(), наряду с basename() являлась одной из наиболее употребительных для работы с файлами и каталогами до введения переменной __DIR__.

Примечание: При проблемах с путями при переносе скриптов с MS Windows на UNIX систему, в первую очередь обращайте внимание на регистр букв. На UNIX-серверах регистр букв в имени файла имеет значение, File.txt и file.txt — это два разных файла, а под MS Windows — один и тот же. Лучше всего писать имя файла всегда точно, соблюдая регистр.