NTFS文件系统下的硬链接和软链接
熟悉Linux系统的同学都知道“硬链接”、“软连接”的概念及其方便的使用,其实自Windows2000之后的NTFS3.0版以来,Windows下也能支持这两个概念了。
硬链接:
在Windows 2000 及以上版本里可以使用 fsutil hardlink create 这个复杂的命令来创建一个硬链接,用法倒是很简单:
fsutil hardlink create <新文件名> <现有文件名>
也可以使用 GNU utilities for Win32 中的 ln 命令来创建,"GNU utilities for Win32 "是一些 GNU 工具在 Win32平台上的移植版本,非常好用。另外Cygwin 里的 ln 也可以创建 硬链接(但创建符号链接时 会以‘快捷方式’出现)。
如果你想在自己程序里创建硬链接,只需要一个很简单的Windows API 函数:
BOOL CreateHardLink( LPCTSTR lpFileName, LPCTSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes );
前两个参数的意思就不用解释了,最后一个参数的用途暂时保留,必须为 NULL。
软连接:
而软连接(symbolic link),NTFS只支持对目录的符号链接,微软把它称作junction,对文件的符号链接,其实Windows平台的解决方案就是——“快捷方式”,不过这与Linux下的 symbolic link不是一个层次上的东西,前者是应用层的功能,后者是底层文件系统的功能。
Windows提供了 MOUNTVOL命令,可以把一个卷链接到另一个卷的目录下,即只能对某个卷的根目录创建 symbolic link。幸运的是我们可以使用 Sysinternals 提供的带有源代码的免费命令行工具 junction.exe 来全功能的完成对 NTFS symbolic link 的管理
SysInternals 套件,里面包含了大量的实用程序,其中 junction.exe 就是用来管理符号连接的,(更多的关于SysInternals使用工具的信息请参看:http://technet.microsoft.com/zh-cn/sysinternals/bb545046.aspx)。
另外,在 Windwos 2000 Resource Kit 里提供了一个命令行工具 linkd.exe 来完成这件事。不过它的查看 symbolic link 信息的功能不如 junction,因为不支持通配符和子目录扫描。
以下是junction.exe的简单使用方法:
要创建一个符号连接:
junction 连接名称 要连接哪一个目录
例如:
C:\>junction test_www d:\www Junction v1.05 - Windows junction creator and reparse point viewer Copyright (C) 2000-2007 Mark Russinovich Systems Internals - http://www.sysinternals.com Created: C:\test_www Targetted at: d:\www
用资源管理器打开 c:\test_www 可以看到和 d:\www 一样的内容。修改一边的文件,另一边的也会同步更新(其实本就没有两份,符号连接就像一个映射)。
要删除一个符号连接:
C:\>junction -d c:\test_www Junction v1.05 - Windows junction creator and reparse point viewer Copyright (C) 2000-2007 Mark Russinovich Systems Internals - http://www.sysinternals.com Deleted c:\test_www.
关于符号链接,需要注意的是,Explorer 对待 symbolic link 有一个很奇怪的行为。那就是,在 Explorer 里一个 symbolic link 跟被它 link 的目录没有区别,删除这个 symbolic link 将会删除被 link 的目录下的所有文件!