Объедините каталог и имя файла в PHP (эквивалент Path.Combine в .Net) - PullRequest
33 голосов
/ 26 июня 2009

Это должен быть простой вопрос, но я просто не могу вспомнить соответствующий API. Поиск в Google с термином « объединить имя каталога php » не даст никаких результатов. Думаю, я задаю этот вопрос и себе, и сообществу программистов.

Как объединить каталог и имя файла, чтобы сформировать полный путь к файлу в PHP? Допустим, имя каталога - «D:\setup program», а имя файла - «mj.txt». Метод должен вернуть меня, на Windows "D:\setup program\mj.txt". Конечно, метод должен возвращать правильный путь к файлу в Linux или другой ОС.

Связанная функция в .Net - Path.Combine , но в PHP я не мог вспомнить это, хотя я должен был видеть это раньше.

Ответы [ 4 ]

35 голосов
/ 26 июня 2009
$filepath = $path . DIRECTORY_SEPARATOR . $file;

Хотя в более новых версиях PHP не имеет значения, по какому пути идет косая черта, поэтому хорошо всегда использовать прямую косую черту.

Вы можете получить правильный абсолютный путь, используя realpath(), это также удалит такие вещи, как лишние косые черты и разрешит ссылки, такие как ../. Он вернет false, если путь неверен.

9 голосов
/ 17 марта 2014

Я думаю, что наиболее чистый и гибкий способ сделать это - использовать функцию соединения плюс константу DIRECTORY_SEPARATOR:

$fullPath = join(DIRECTORY_SEPARATOR, array($directoryPath, $fileName));
1 голос
/ 29 октября 2018

Все приведенные ответы не допускают пустых значений в $directoryPath и не обрабатывают дублирующие косые черты. Хотя это правда, что PHP очень устойчив к ошибкам, первая точка может быть фатальной, и вторая точка не должна игнорироваться, если вы пишете чистый код.

Итак, правильное решение:

function PathCombine($one, $other, $normalize = true) {

    # normalize
    if($normalize) {
        $one = str_replace('/', DIRECTORY_SEPARATOR, $one);
        $one = str_replace('\\', DIRECTORY_SEPARATOR, $one);
        $other = str_replace('/', DIRECTORY_SEPARATOR, $other);
        $other = str_replace('\\', DIRECTORY_SEPARATOR, $other);
    }

    # remove leading/trailing dir separators
    if(!empty($one) && substr($one, -1)==DIRECTORY_SEPARATOR) $one = substr($one, 0, -1);
    if(!empty($other) && substr($other, 0, 1)==DIRECTORY_SEPARATOR) $other = substr($other, 1);

    # return combined path
    if(empty($one)) {
        return $other;
    } elseif(empty($other)) {
        return $one;
    } else {
        return $one.DIRECTORY_SEPARATOR.$other;
    }

}

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

0 голосов
/ 26 июня 2009

Вы можете просто объединить его с константой php DIRECTORY_SEPARATOR или просто использовать прямую косую черту. Windows, вероятно, не возражает = D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...