|
|
原文地址:
首先簡(jiǎn)單理解一下硬鏈接和符號(hào)(軟)鏈接的區(qū)別(此文中的符號(hào)鏈接和軟鏈接指同一概念):
本文出自 51CTO.COM技術(shù)博客硬連接指向的是節(jié)點(diǎn)(inode),而軟連接指向的是路徑(path) 。 最初的文件名與所有的硬鏈接地位是對(duì)等的,比如為文件 a 建立了硬鏈接 b、c、d。那么a、b、c、d之中只要有一個(gè)文件未刪除,這個(gè)文件就可通未刪除的名稱(chēng)訪(fǎng)問(wèn)的。你也可以認(rèn)為每個(gè)文件都可認(rèn)為至少有一個(gè)硬鏈接,就是說(shuō) a 也是一個(gè)硬鏈接。 軟鏈接特性上有些類(lèi)似于快捷方式,比如為原文件 a 建立了軟鏈接 b、c、d。刪除b、c 或 d 訪(fǎng)問(wèn)到 a,但是只要?jiǎng)h除了 a,軟鏈接就不可用了。但是 windows 下的快捷方式只能在資源管理器中有用,它只是一個(gè) lnk 文件,如果是一個(gè)目錄的快捷方式,它是不能通過(guò) cd 命令或路徑進(jìn)入。 硬鏈接文件有兩個(gè)限制(Unix/Linux 和 Windows 也都如此) 1、不允許給目錄創(chuàng)建硬鏈接; 2、只有在同一文件系統(tǒng)中的文件之間才能創(chuàng)建鏈接。 更詳細(xì)區(qū)別請(qǐng)見(jiàn):硬鏈結(jié)和符號(hào)鏈接的區(qū)別 ,具體不多述,本文的內(nèi)容關(guān)鍵在 Windows 下如何建立軟硬鏈接。 熟悉過(guò) Unix/Linux 都應(yīng)該知道,Unix/Linux 用 ln 建立硬鏈接,ln -s 建立軟鏈接,那么 Windows 下是如何做到的呢? 一: Windows 下創(chuàng)建硬鏈接,只能適用于 NTFS 文件系統(tǒng)。使用命令 fsutil hardlink 語(yǔ)法 fsutil hardlink create NewFileName ExistingFileName 參數(shù) create 建立現(xiàn)有文件和新文件之間的 NTFS 硬鏈接。NTFS 硬鏈接與 POSIX 硬鏈接相似。 NewFileName 指定要將創(chuàng)建硬鏈接的文件。 ExistingFileName 指定要從中創(chuàng)建硬鏈接的文件。 當(dāng)然,如果你想在自己的程序里創(chuàng)建硬鏈接,那也是很容易的,只需要一個(gè)很簡(jiǎn)單的 API 函數(shù): BOOL CreateHardLink( LPCTSTR lpFileName, LPCTSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes ); 適用于 Win2000 及以上版本的系統(tǒng),前兩個(gè)參數(shù)的意思就不用解釋了,最后一個(gè)參數(shù)的用途暫時(shí)保留,必須為 NULL。 二:Windows 下創(chuàng)建軟鏈接,NTFS 只支持對(duì)目錄的軟鏈接,微軟把它稱(chēng)作 junction。但是對(duì)于文件的軟鏈接,微軟也有提供解決方案,那就是快捷方式(Shortcut,.lnk 文件)。不過(guò)軟鏈接和快捷方式不是一個(gè)層次上的東西,前者是底層文件系統(tǒng)的功能,后者是應(yīng)用層的功能。Windows 下目錄的快捷方式用 dir 看起來(lái)是個(gè)文件。 在 [url]http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx[/url] 下載 junction.exe。junction 的命令語(yǔ)是: junction LinkDirectory ExistingDirectory 例如:junction d:\link c:\winnt 將為c:\winnt 建立一個(gè)鏈接目錄 d:\link,C和D分區(qū)都要是 NTFS 格式,在資源管理器和 dir 列示中 d:\link 都以目錄的面目存在的。d:\link 就像是 c:\winnt 的一個(gè)引用一般,刪除 d:\link 目錄中的內(nèi)容也就是刪除了 c:\winnt 中的內(nèi)容,但刪除 d:\link 本身是不會(huì)影響到 c:\winnt 的。 相應(yīng)的,在程序中也有一個(gè) API 函數(shù) CreateSymbolicLink 支持創(chuàng)建軟鏈接,不過(guò)來(lái)得太晚了,要 Windows VISTA 和 Windows Server 2008 那樣的版本才支持,先還是別想了,API 原型是: BOOL WINAPI CreateSymbolicLink( __in LPCWSTR lpSymlinkFileName, __in LPCWSTR lpTargetFileName, __in DWORD dwFlags ); 參數(shù): lpSymlinkFileName 要?jiǎng)?chuàng)建的符號(hào)鏈接名稱(chēng). lpTargetFileName 符號(hào)鏈接所對(duì)應(yīng)目標(biāo)的名稱(chēng). dwFlags 標(biāo)識(shí)目標(biāo)是文件還是目錄. 取值0x0 代表是文件,SYMBOLIC_LINK_FLAG_DIRECTORY或0x1 代表是目錄 三:其他方法 也可以使用 GNU utilities for Win32 中的 ln 來(lái)創(chuàng)建硬鏈接。這是一些 GNU 工具的 Win32 移植版本,非常好用。另外 Cygwin 里的 ln 不但可以創(chuàng)建硬鏈接也可以創(chuàng)建符號(hào)鏈接(在 Windows 里就是快捷方式 .lnk 文件)。 實(shí)際需求引出:Web 應(yīng)用中上傳文到 WEB 下的某個(gè)子目錄中,這樣可以直接通過(guò)網(wǎng)頁(yè)鏈接的方式訪(fǎng)問(wèn)到這些文件。但是會(huì)出現(xiàn)的問(wèn)題就是,每當(dāng)完全重新部署應(yīng)用時(shí),如果忘了把存上傳文件的目錄進(jìn)行備份,那么原有上傳文件就全沒(méi)了。原來(lái)項(xiàng)目部署在 Unix 下的做法是,把那個(gè)上傳目錄作為另一個(gè)目錄的符號(hào)鏈接,實(shí)際存儲(chǔ)文件的目錄不在 WEB 應(yīng)用目錄下,重新部署時(shí)只要重建這個(gè)符號(hào)鏈接即可,不會(huì)有覆蓋文件的危險(xiǎn)。當(dāng)然在 Unix/Linux 是好解決,只要用 ln -s 命令就行,然而對(duì)于 Windows 系統(tǒng)卻要想點(diǎn)辦法,為目錄建立快捷的方式是行不通的,目錄的鏈接只會(huì)當(dāng) lnk 文件對(duì)待,在 Explorer 中可以雙擊打開(kāi),但對(duì)于網(wǎng)頁(yè)鏈接或者 cd 命令是無(wú)法正確定位的。于是思考起如何在 Windows 下創(chuàng)建符號(hào)連接的問(wèn)題,才有了上文。 題外:對(duì)于以上的需求,可以在 Web 應(yīng)用外部事先建立好一個(gè)目錄,賦上相應(yīng)的權(quán)限。然后在應(yīng)用的配置文件中記下這個(gè)目錄的絕對(duì)路徑,上傳時(shí)往其中寫(xiě)文件沒(méi)問(wèn)題,關(guān)鍵瀏覽時(shí),因?yàn)槲募趹?yīng)用之后,不能直接通過(guò)網(wǎng)址瀏覽到,就需要通過(guò)一個(gè)程序去讀取相應(yīng)的文件,發(fā)送到瀏覽器之前必須設(shè)置根據(jù)文件類(lèi)型設(shè)置響應(yīng) MINE 類(lèi)型,這個(gè) MINE 類(lèi)型可以在上傳時(shí)記載在庫(kù)的。 現(xiàn)在覺(jué)得這種方法還優(yōu)于用符號(hào)鏈接的方式,至為無(wú)需每次完整發(fā)布后重創(chuàng)建符號(hào)鏈接,而且實(shí)際中也出現(xiàn)過(guò)完全重部署后,目標(biāo)目錄中文件完全丟失的情況。 |
Junction下載|
|
來(lái)自: 農(nóng)夫子oice > 《windows》