【收藏】Windows下如何建立軟連結和永久連結(類linux ln)

來源:互聯網
上載者:User

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

硬串連指向的是節點(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 標識目標是檔案還是目錄. 取值0×0 代表是檔案,SYMBOLIC_LINK_FLAG_DIRECTORY或0×1 代表是目錄

三:其他方法

也可以使用 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命令詳細用法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.