在Linux下,可以很方便的通過ln命令創建對文件和對文件夾的軟鏈接。在Windows下,通過快捷方式,可以創建到文件和文件夾的鏈接,但是這軟鏈接不是一個層面的上東西。軟鏈接是底層文件系統層面的,而快捷方式為應用層面的。
對文件夾,只能創建軟鏈接,用junction這個小工具可以幫忙,用法如下:junction <junction directory> <junction target>
即第一個參數為要創建的連接點目錄,第二個為源目錄。如要將D:\temp\jboss.app.test 創建一個軟鏈接到d:\temp\jboss\test.war下,語法如下:
junction d:\temp\jboss\test.war D:\temp\jboss.app.test
創建之后,訪問d:\temp\jboss\test.war和方法d:\temp\jboss.app.test是一樣的,應用程序遍歷jboss下的所有文件和文件夾時,test.war會被認為是一個正常的文件夾了。
junction下載地址:http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx
參考文檔:http://wenku.baidu.com/view/a92e496448d7c1c708a14548.html
##################################################################################
以下為引用文章http://tilt.lib.tsinghua.edu.cn/node/480
Windows 下也能創建硬鏈接和軟鏈接(符號鏈接)
來源地址: http://www.blogjava.net/Unmi/archive/2007/11/26/163055.html
首先簡單理解一下硬鏈接和符號鏈接(軟鏈接)的區別(此文中的符號鏈接和軟鏈接指同一概念):
硬連接指向的是節點(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、只有在同一文件系統中的文件之間才能創建鏈接。
更詳細區別請見:硬鏈接和符號鏈接的區別,具體不多述,本文的內容關鍵在 Windows 下如何建立軟硬鏈接。
熟悉過 Unix/Linux 都應該知道,Unix/Linux 用 ln 建立硬鏈接,ln -s 建立軟鏈接,那么 Windows 下是如何做到的呢?
一: Windows 下創建硬鏈接,只能適用於 NTFS 文件系統。使用命令 fsutil hardlink
語法
fsutil hardlink create NewFileName ExistingFileName
參數
create 建立現有文件和新文件之間的 NTFS 硬鏈接。NTFS 硬鏈接與 POSIX 硬鏈接相似。
NewFileName 指定要將創建硬鏈接的文件。
ExistingFileName 指定要從中創建硬鏈接的文件。
當然,如果你想在自己的程序里創建硬鏈接,那也是很容易的,只需要一個很簡單的 API 函數:
BOOL CreateHardLink(
LPCTSTR lpFileName,
LPCTSTR lpExistingFileName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
適用於 Win2000 及以上版本的系統,前兩個參數的意思就不用解釋了,最后一個參數的用途暫時保留,必須為 NULL。
二:Windows 下創建軟鏈接
NTFS只支持對目錄的軟鏈接,微軟把它稱作 junction。但是對於文件的軟鏈接,微軟也有提供解決方案,那就是快捷方式(Shortcut,.lnk 文件)。不過軟鏈接和快捷方式不是一個層次上的東西,前者是底層文件系統的功能,后者是應用層的功能。Windows 下目錄的快捷方式用 dir 看起來是個文件。
在 http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx 下載 junction.exe。junction 的命令語是:
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 類型可以在上傳時記載在庫的。
現在覺得這種方法還優於用符號鏈接的方式,至為無需每次完整發布后重創建符號鏈接,而且實際中也出現過完全重部署后,目標目錄中文件完全丟失的情況。
參考:
1. NTFS 下的硬鏈接(hard link)與符號鏈接(symbolic link)
2. 原來Windows下面也有硬鏈接
3. Windows上創建硬鏈接
4. MSDN CreateSymbolicLink Function
5. MSDN CreateHardLink Function
6. ln命令詳細用法