F:\>mkdir link-target F:\>mklink /D link f:\link-target
(注意小写字母f:
在符号链接目标中)
在PHP中,我运行这个:
$dir = realpath('f:\link'); var_dump($dir); $dir = realpath($dir); var_dump($dir);
哪些产出:
string 'f:\link-target' (length=14) string 'F:\link-target' (length=14)
注意第二个实时path上的情况变化。
这是一个错误,或打算? 最好的解决办法是什么?
这是打破这样的情况:
function check_link($to, $from) { if (realpath($to) !== realpath($from)) { ... } }
其中用于检查$to
存在,并链接到$from
。
编辑:
我需要在Windows和Linux上的一致的行为,并有以下的工作是非常讨厌的:
if (realpath($from) === false) { } elseif (realpath($to) === false) { } else { do { $to = realpath($to); } while (realpath($to) !== false && $to !== realpath($to)); do { $from = realpath($from); } while (realpath($from) !== false && $from !== realpath($from)); if ($to !== $from) { ... } }
编辑2:
在进一步的调查中,我注意到,在Windows符号链接只有1级深:
// F:\>mkdir link-target // F:\>mklink /D link f:\link-target // F:\>mklink /D link2 f:\link $dir = realpath('f:\link2'); var_dump($dir); $dir = realpath($dir); var_dump($dir); $dir = realpath($dir); var_dump($dir); // string 'f:\link' (length=7) // string 'f:\link-target' (length=14) // string 'F:\link-target' (length=14)
结果
do { $to = realpath($to); } while (realpath($to) !== false && $to !== realpath($to));
是唯一的方法。
这是有道理的,如果你想通过。 对于第一个路径分辨率,它是找到什么被定义为链接目标。 对于第二种情况,您将得到相同的路径,但是具有正确的驱动器盘符的大小写。
在Windows文件系统下,路径/文件名不区分大小写。 为了比较它们,只需在测试之前将它们转换为大写或小写。
if (strtoupper(realpath($to)) !== strtotupper(realpath($from))) {