如何在 PHP 中获取不存在文件的规范化路径(真实路径)?

Tha*_*you 6 php path realpath canonicalization

脚本文件

$filename = realpath(sprintf("%s/%s", getcwd(), $argv[1]));
var_dump($filename);
Run Code Online (Sandbox Code Playgroud)

让我们尝试一些事情

[/foo/bar/bof] $ php script.php ../foo.txt
string(16) "/foo/bar/foo.txt"

[/foo/bar/bof] $ php script.php ../nonexistent.txt
bool(false)
Run Code Online (Sandbox Code Playgroud)

该死!realpath返回 false 因为文件不存在。

我想看到的../nonexistent.txt

string(24) "/foo/bar/nonexistent.txt"
Run Code Online (Sandbox Code Playgroud)

如何获取 PHP 中任何相对路径的规范化路径?

注意:我看到了一些有关解析符号链接路径的问题。这些问题的答案不适用于我的问题。

Tha*_*you 0

这是我能想到的最好的

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));
}
Run Code Online (Sandbox Code Playgroud)

它要求路径中的所有目录都存在。路径basename的 是唯一可能不存在的部分。

如果目录名不存在,将会抛出错误。