В чем разница между / адресацией и ./ адресацией?

Я работаю над веб-сайтом PHP, где мне нужно было получить список файлов в каталоге изображений. В примере на PHP.net адресация показана с помощью косой черты, как показано в примере. Этот шаблон адресации не работал. Вместо этого адрес должен начинаться с ./. В чем разница?

<?php
$dir    = '/tmp';
$files1 = scandir($dir);
$files2 = scandir($dir, 1);

print_r($files1);
print_r($files2);
?>

Поиск других вопросов касался одинарной и двойной точки, но я не вижу сообщений с косой чертой без точки.


person Nora McDougall-Collins    schedule 23.09.2018    source источник
comment
./ = текущий директор / = корневой каталог   -  person    schedule 24.09.2018


Ответы (3)


. указывает текущий каталог. Предположим, например, что ваш текущий путь /var/www:

Если вы скажете ./tmp, то вы ищете каталог /var/www/tmp

Если вы говорите /tmp, вы ищете /tmp (начиная с корня)

person Salvatore Q Zeroastro    schedule 23.09.2018

Возможно, вы являетесь пользователем Windows и не знакомы с тем, как Linux обращается к файлам, но, по сути, букв дисков нет. / - корень файловой системы, в основном эквивалент C:\ в Windows (хотя и не совсем). Он также работает в Windows, за исключением того, что он будет относиться к корню раздела, в котором работает ваш скрипт, поскольку Windows разделяет каждый раздел на другой букве диска.

В корне файловой системы есть стандартная папка с именем tmp, и если вы хотите сослаться на нее, вы хотите указать полный путь /tmp.

Простое использование tmp или ./tmp будет относиться к папке tmp на вашем локальном пути, которая представляет собой совершенно другую папку с тем же именем (которая может даже не существовать).

Если вы не хотите указывать полный путь, а вместо этого указывать относительный или локальный путь, вы не ставите / в начале. Вы можете просто ничего не указать или указать ./, чтобы явно указать, что это путь относительно вашего текущего рабочего каталога, равного ..

Неважно, в какой папке работает ваш скрипт, . всегда представляет его. На самом деле в большинстве случаев нет необходимости указывать ./, поскольку относительные пути неявны.

В соответствующем примечании .. представляет родительскую папку.

Например, мой скрипт /var/www/script.php, когда я его запускаю:

  • . - это папка /var/www.
  • fopen('note.txt', 'r') откроет файл /var/www/note.txt для чтения.
  • fopen('./note.txt', 'r') будет делать то же самое.
  • .. - это папка /var.
  • ../../tmp совпадает с /tmp.

Обратите внимание, что текущий рабочий каталог, представленный ., остается постоянным, даже если вы include() скрипт из подпапки.

Это может сбивать с толку, потому что . может не быть папкой, в которую включен скрипт. Чтобы обойти эту проблему, используйте __DIR__, чтобы получить папку, в которой находится ваш скрипт, он получит текущую папку вашего скрипта, даже если вы ее вызываете. через include() или позвонив из другого каталога.

person Havenard    schedule 23.09.2018
comment
. - это не путь, по которому находится скрипт. Это текущий рабочий каталог. Если кто-то или что-то не изменит его, это будет путь, по которому скрипт запускается из, а не тот, по которому он находится. - person Jörg W Mittag; 24.09.2018

  • / обозначает корневой каталог вашего сервера. Как в /var/www/.
  • ./ обозначает текущий каталог, в котором выполняется сценарий. Это эквивалент _ 4_. Например, вы сейчас находитесь в /php/scripts, это будет относиться к /var/www/php/scripts.
  • ../ обозначает родительскую папку и может быть объединен в цепочку для перехода на несколько уровней вверх.

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

Если вы пытаетесь получить доступ к /var/www/tmp из /var/www/php/scripts/script.php, вы можете использовать:

  • ../../tmp
  • /tmp

Обратите внимание: если вы не уверены, сколько уровней вам нужно для «продвижения вверх», вы можете добавить бесконечное количество ../; он не «вырвется» из корня. Сказав это, ссылка непосредственно из корня часто намного проще.

person Obsidian Age    schedule 23.09.2018
comment
/ не обозначает корневой каталог веб-сайта, он обозначает корневой каталог сервера. - person Havenard; 24.09.2018
comment
Ты прав. - person Obsidian Age; 24.09.2018