澄清一下
在 unix/linux 中
硬連結(透過此函數建立)不能跨越不同的檔案系統。
軟連結可以指向任何位置。
在 linux 中,不允許對目錄建立硬連結。
(PHP 4, PHP 5, PHP 7, PHP 8)
link — 建立硬連結
target
連結的目標。
link
連結名稱。
如果 link
已經存在,或者 target
不存在,則此函數會失敗並發出 E_WARNING
錯誤。
範例 #1 建立一個簡單的硬連結
<?php
$target = 'source.ext'; // 這是已存在的檔案
$link = 'newfile.ext'; // 這是您想要連結到的檔案名稱
link($target, $link);
?>
為了開發備份工具,我需要在 Windows 系統上使用類似連結的功能。由於 Windows 上沒有提供此功能,我嘗試在一些工具的幫助下自行完成。您只需要將 sysinternals 的 junction.exe 放在您的 %PATH% 中即可。
<?php
if(!function_exists('link')){ // 假設是 Windows 系統
function link($target, $link){
if(is_dir($target)){
// 在 Windows 中,junctions 用於連結目錄
exec("junction $link $target", $lines, $val);
return 0 == $val;
}elseif(is_file($target)){
// 在 Windows 中,硬連結 (Hardlinks) 用於連結檔案
exec("fsutil hardlink create $link $target", $lines, $val);
return 0 == $val;
}
return false;
}
}
?>
http://www.sysinternals.com/Utilities/Junction.html
我注意到,與 Unix 的 ln 指令不同,第二個參數不能是目錄名稱,也就是說,如果您想要建立一個與目標檔案同名的連結(顯然在不同的目錄中),您必須在連結參數中指定檔名。
範例
Unix ln 指令
ln /dir1/file /dir2/ // 正常,建立 /dir2/file 連結
PHP link 函式
link ("/dir1/file", "/dir2/"); // 錯誤,會出現「檔案已存在」的警告
link ("/dir1/file", "/dir2/file"); // 正常,建立 /dir2/file 連結