2012-05-02 18 views
2

我这是犯了这样的我的Windows服务器上的符号链接:PHP的realpath

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) 

注意第二个实时路径上的情况发生了变化。

这是一个错误,或打算?最好的解决方法是什么?

它打破的情况下,这样的:这是用来检查$to存在,

function check_link($to, $from) { 
    if (realpath($to) !== realpath($from)) { 
     ... 
    } 
} 

链接到$from

  • PHP 5.4
  • 的Windows 7

编辑:

我需要在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:

在furter调查中,我已经注意到了,在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) 

回答

1

原来

do { 
    $to = realpath($to); 
} while (realpath($to) !== false && $to !== realpath($to)); 

是唯一的出路。

https://bugs.php.net/bug.php?id=61933

+0

这应该更快:'while($ to = realpath($ from)和$ to!== $ from){$ from = $ to; }' – user

0

这是有道理的,如果你认为它通过。对于第一个路径分辨率,它找到了被定义为链接目标的内容。对于第二种情况,您最终会得到相同的路径,但其中一个具有正确的驱动器盘符大写字母。

在Windows文件系统下,路径/文件名不区分大小写。为了比较它们,只需在测试之前将它们转换为大写或小写。

if (strtoupper(realpath($to)) !== strtotupper(realpath($from))) { 
+0

对不起,忘了提,周围的工作需要放在Windows和Linux一致的,因此,不能只是'strtolower'他们。而且我会假设'realpath'函数应该总是返回相同的东西,即绝对路径。 – Petah

+0

@Petah从不会像布拉德指出的那样少 - Windows不区分大小写,所以你不能保证两个字符串是相同的。也许你应该在比较中检测环境。 – Rudu

+0

@Petah,我知道你在做什么,但是我不认为'realpath()'在返回符号链接的路径时是错误的。在任何情况下,为了正确比较路径,您必须检查文件系统和/或平台,以查看它是否关注区分大小写的路径。 – Brad

相关问题