Windows下建立硬鏈結和軟鏈結 符號鏈結

2021-06-20 03:35:06 字數 2758 閱讀 9278

首先簡單理解一下硬鏈結和符號鏈結(軟鏈結)的區別(此文中的符號鏈結和軟鏈結指同一概念):

硬連線指向的是節點(inode),而軟連線指向的是路徑(path) 。

最初的檔名與所有的硬鏈結地位是對等的,比如為檔案 a 建立了硬鏈結 b、c、d。那麼a、b、c、d之中只要有乙個檔案未刪除,這個檔案就可通未刪除的名稱訪問的。你也可以認為每個檔案都可認為至少有乙個硬鏈結,就是說a也是乙個硬鏈結。

軟鏈結特性上有些類似於快捷方式,比如為原檔案 a 建立了軟鏈結 b、c、d。刪除b、c 或 d 訪問到 a,但是只要刪除了 a,軟鏈結就不可用了。但是 windows 下的快捷方式只能在資源管理器中有用,它只是乙個 lnk 檔案,如果是乙個目錄的快捷方式,它是不能通過 cd 命令或路徑進入。

硬鏈結檔案有兩個限制(unix/linux 和 windows 也都如此)

1、不允許給目錄建立硬鏈結;

2、只有在同一檔案系統中的檔案之間才能建立鏈結。

熟悉過 unix/linux 都應該知道,unix/linux 用 ln 建立硬鏈結,ln -s 建立軟鏈結,那麼 windows 下是如何做到的呢?

語法fsutil hardlink create newfilename existingfilename引數

create 建立現有檔案和新檔案之間的 ntfs 硬鏈結。ntfs 硬鏈結與 posix 硬鏈結相似。

newfilename 指定要將建立硬鏈結的檔案。

existingfilename 指定要從中建立硬鏈結的檔案。

當然,如果你想在自己的程式裡建立硬鏈結,那也是很容易的,只需要乙個很簡單的 api 函式:

bool createhardlink(

lpctstr lpfilename,

lpctstr lpexistingfilename,

lpsecurity_attributes lpsecurityattributes

);

適用於 win2000 及以上版本的系統,前兩個引數的意思就不用解釋了,最後乙個引數的用途暫時保留,必須為 null。

ntfs只支援對目錄的軟鏈結,微軟把它稱作 junction。但是對於檔案的軟鏈結,微軟也有提供解決方案,那就是快捷方式(shortcut,.lnk 檔案)。不過軟鏈結和快捷方式不是乙個層次上的東西,前者是底層檔案系統的功能,後者是應用層的功能。windows 下目錄的快捷方式用 dir 看起來是個檔案。

junction  linkdirectory existingdirectory

例如:junction d:\link c:\winnt

將為c:\winnt 建立乙個鏈結目錄 d:\link,c和d分割槽都要是 ntfs 格式,在資源管理器和 dir 列示中 d:\link 都以目錄的面目存在的。d:\link 就像是 c:\winnt 的乙個引用一般,刪除 d:\link 目錄中的內容也就是刪除了 c:\winnt 中的內容,但刪除 d:\link 本身是不會影響到 c:\winnt 的。

相應的,在程式中也有乙個 api 函式 createsymboliclink 支援建立軟鏈結,不過來得太晚了,要 windows vista 和 windows server 2008 那樣的版本才支援,先還是別想了,api 原型是:

bool winapi createsymboliclink(

__in  lpcwstr lpsymlinkfilename,

__in  lpcwstr lptargetfilename,

__in  dword dwflags

);

引數:lpsymlinkfilename 要建立的符號鏈結名稱.

lptargetfilename 符號鏈結所對應目標的名稱.

dwflags 標識目標是檔案還是目錄. 取值0x0 代表是檔案,symbolic_link_flag_directory或0x1 代表是目錄

也可以使用 gnu utilities for win32 中的 ln 來建立硬鏈結。這是一些 gnu 工具的 win32 移植版本,非常好用。另外 cygwin 裡的 ln 不但可以建立硬鏈結也可以建立符號鏈結(在 windows 裡就是快捷方式 .lnk 檔案)。

實際需求引出:web 應用中上傳文到 web 下的某個子目錄中,這樣可以直接通過網頁鏈結的方式訪問到這些檔案。但是會出現的問題就是,每當完全重新部署應用時,如果忘了把存上傳檔案的目錄進行備份,那麼原有上傳檔案就全沒了。原來專案部署在 unix 下的做法是,把那個上傳目錄作為另乙個目錄的符號鏈結,實際儲存檔案的目錄不在 web 應用目錄下,重新部署時只要重建這個符號鏈結即可,不會有覆蓋檔案的危險。當然在 unix/linux 是好解決,只要用 ln -s 命令就行,然而對於 windows 系統卻要想點辦法,為目錄建立快捷的方式是行不通的,目錄的鏈結只會當 lnk 檔案對待,在 explorer 中可以雙擊開啟,但對於網頁鏈結或者 cd 命令是無法正確定位的。於是思考起如何在 windows 下建立符號連線的問題,才有了上文。

題外:對於以上的需求,可以在 web 應用外部事先建立好乙個目錄,賦上相應的許可權。然後在應用的配置檔案中記下這個目錄的絕對路徑,上傳時往其中寫檔案沒問題,關鍵瀏覽時,因為檔案在應用之後,不能直接通過**瀏覽到,就需要通過乙個程式去讀取相應的檔案,傳送到瀏覽器之前必須設定根據檔案型別設定響應 mine 型別,這個 mine 型別可以在上傳時記載在庫的。

現在覺得這種方法還優於用符號鏈結的方式,至為無需每次完整發布後重建立符號鏈結,而且實際中也出現過完全重部署後,目標目錄中檔案完全丟失的情況。

CentOS下建立硬鏈結和軟鏈結

ln s f1 f3 建立f1的乙個符號連線檔案f3 1.linux鏈結概念 linux鏈結分兩種,一種被稱為硬鏈結 hard link 另一種被稱為符號鏈結 symbolic link 預設情況下,ln命令產生硬鏈結。硬連線 硬連線指通過索引節點來進行連線。在linux的檔案系統中,儲存在磁碟分割...

軟鏈結和硬鏈結的建立

硬鏈結就是同乙個檔案使用了多個別名 他們有共同的 inode 硬鏈結可由命令 link 或 ln 建立,如 link oldfile newfile ln oldfile newfile 由於硬鏈結是有著相同 inode 號僅檔名不同的檔案,因此,刪除乙個硬鏈結檔案並不影響其他有相同 inode 號...

linux 建立軟鏈結和硬鏈結

linux 系統中有軟鏈結和硬鏈結兩種特殊的 檔案 軟鏈結可以看作是windows中的快捷方式,可以讓你快速鏈結到目標檔案或目錄。硬鏈結則透過檔案系統的inode來產生新檔名,而不是產生新檔案。建立方法都很簡單 軟鏈結 符號鏈結 ln s source target 硬鏈結 實體鏈結 ln sour...