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 的目录下的所有文件!

相关推荐