script.php
$filename = realpath(sprintf("%s/%s", getcwd(), $argv[1]));
var_dump($filename);
让我们尝试一些东西
[/foo/bar/bof] $ php script.php ../foo.txt
string(16) "/foo/bar/foo.txt"
[/foo/bar/bof] $ php script.php ../nonexistent.txt
bool(false)
该死! realpath
返回 false,因为该文件不存在。
对于 ../nonexistent.txt
,我希望看到的是
string(24) "/foo/bar/nonexistent.txt"
如何获取 PHP 中任何相对路径的规范化路径?
注意:我看到了一些关于解析符号链接(symbolic link)路径的问题。这些问题的答案不适用于我的问题。
最佳答案
这是我能想到的最好的
function canonicalize_path($path, $cwd=null) {
// don't prefix absolute paths
if (substr($path, 0, 1) === "/") {
$filename = $path;
}
// prefix relative path with $root
else {
$root = is_null($cwd) ? getcwd() : $cwd;
$filename = sprintf("%s/%s", $root, $path);
}
// get realpath of dirname
$dirname = dirname($filename);
$canonical = realpath($dirname);
// trigger error if $dirname is nonexistent
if ($canonical === false) {
trigger_error(sprintf("Directory `%s' does not exist", $dirname), E_USER_ERROR);
}
// prevent double slash "//" below
if ($canonical === "/") $canonical = null;
// return canonicalized path
return sprintf("%s/%s", $canonical, basename($filename));
}
它要求路径中的所有目录都存在。路径的 basename
是唯一可以不存在的部分。
如果目录名不存在,将抛出错误。
关于php - 如何在 PHP 中获取不存在文件的规范化路径(真实路径)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23588972/