Помогите понять copy()

zey_ser

Новичок
Мне не понятна вот в этом коде
PHP:
$uploaddir = './files/';
    $uploadfile = $uploaddir.basename($_FILES['uploadfile']['name']);

    // Копируем файл из каталога для временного хранения файлов:
    if (copy($_FILES['uploadfile']['tmp_name'], $uploadfile))
точка перед /files/. Если убрать эту точку, то возникает предупреждение Warning: copy(/files/1.jpg): failed to open stream: No such file or directory. Во-втором параметре мы должны указывать путь к целевому файлу. Но зачем там точка нужна? Почему не просто указать каталог куда класть файл?
 

zey_ser

Новичок
Полезный для меня материал. Спасибо! Но все же...
file.php (фал лежит в той же папке)
./file.php (фал лежит в той же папке. такая запись иногда требуется в некоторых юникс системах)
./ - это более универсальный подход? Он везде будет работать если я всегда буду добавлять ./ или на windows снова ошибка с неправильной директорией?
 

Andkorol

Новичок
Он везде будет работать если я всегда буду добавлять ./ или на windows снова ошибка с неправильной директорией?
точка перед /files/. Если убрать эту точку, то возникает предупреждение Warning: copy(/files/1.jpg): failed to open stream: No such file or directory.
У тебя же эта ошибка, только когда ты убираешь точку перед слэшем (./files/) т.е. остаётся только слэш (/files/).
/files/ и ./files/, равно как и /files/ и files/ – это разные пути в зависимости от расположения скрипта.
 

zey_ser

Новичок
У тебя же эта ошибка, только когда ты убираешь точку перед слэшем (./files/) т.е. остаётся только слэш (/files/).
/files/ и ./files/, равно как и /files/ и files/ – это разные пути в зависимости от расположения скрипта.
Я так понимаю проблема в том, что я думал обращаться надо к каталогам как на сайте (/dir/), но в файловой системе надо убирать первый слеш при относительных путях. Я правильно понял?
 
Последнее редактирование:

zey_ser

Новичок
images/picture.jpg (файл лежит в капке images, которая находится в текущей)
Вот это мой случай. А если я поставлю "/" перед images то папка будет искаться в корне файловой системы. Но вопрос то актуален. Если ставить везде ./ пути работать будут и на юникс системах и на виндоус?
 

Andkorol

Новичок
Почему бы просто не дочитать материал по ссылке до конца?
Константа __FILE__ содержит имя текущего исполняемого файла.
В отличие от PHP_SELF она содержит имя файла, исполяющегося в данный момент.
очень полезной представляется конструкция dirname(__FILE__), на которую желательно заменить все вызовы файлов, лежащих в том же каталоге, что и вызывающий скрипт. Например:
require dirname(__FILE__)."/init.php"
 

AnrDaemon

Продвинутый новичок
Читай ещё раз.
Столько раз, сколько понадобится, до тех пор, пока сам на свой вопрос не ответишь.
 

Yaponchick

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

hell0w0rd

Продвинутый новичок
Есть такая функция realpath. Интерпритатор выполняет ее каждый раз, когда ты вызываешь любую функцию, работающую с файловой системой.
Точка раскрывается как __DIRNAME__ скрипта.
Хорошим тоном считается вообще не использовать относительные пути. В php для этого используется конкатенация, то есть:
Код:
copy(__DIRNAME__ . '/foo/bar', $dest);
 

AnrDaemon

Продвинутый новичок
__DIR__ (since 5.3 IIRC)
Либо
dirname(__FILE__) (since as long as I can remember)
 
Сверху