2012-05-02 17 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

相關問題