找回密码
 立即注册

QQ登录

只需一步,快速开始

教程经验总索引TVMW5/小日本5 索引【视频转换】小日本4/TE4XP 索引【视频转换】TAW4 / TDA3 索引【DVD打包软件】
Nero 索引DVD-Lab 索引【DVD打包软件】编解码器 索引 【必读】固顶帖011号
查看: 2362|回复: 0

[资料] 硬链接(hard link)与符号链接(symbolic link)

[复制链接]

9328

威望

312

金钱

1万

贡献

管理员

自由的灵魂

积分
99891
主题
5265
回帖
26224
注册时间
2003-4-10
最后登录
2024-5-4
发表于 2011-11-28 01:25:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
【转贴】



某些软件的工作目录没有选项可以改 或者某些软件必须安装在英文目录下 而我又有自己对于软件的中文目录分类 总而言之因为各种各样的原因 当你有需求将一个目录从一个位置换到另外一个位置而不改变他的访问路径的时候 就需要用到符号链接了 XP下我是用junction工具来实现的 最近装了WIN7的虚拟机尝尝新折腾玩 发现他自带一个更加强劲的mklink工具 以前学LINUX的时候学过硬链接和符号链接 不过时间很久了 虽然知道概念不过空口说不出来...........就到处收集了点文章拼凑整理如下:

在 Linux 使用的 ext2 等文件系统里,都有 hard link 与 symbolic link 的功能,这个功能简单的说就是让我们可以用多个路径去访问同一个文件或者目录。比如说让 /vmlinuz 和 /boot/vmlinuz-2.6.7-1-38 表示的是同一个文件。但 hard link 和 symbolic link 还是有区别的

Hard link 表示,它和原文件名指向的是存储设备上同一个文件内容。就好像这个文件内容有多个文件名一样,每个文件名有相等地位。删除其中任何一个之后,事实上文件内容并不会被删除掉,仍然可以用其他的名称来访问这个文件。只有当最后一个指向这个文件内容的文件名被删除掉之后,文件内容才被删除。也就是说,一个文件的 hard link 跟此文件本来的名称并没有任何本质上的区别。需要注意的是,因为每个分区(partition)上都可能有相同的存储位置地址,所以 hard link 必须跟被 link 的文件在同一个分区上。另外,目录不支持 hard link。 Symbolic link 也称 soft link,它类似于 Windows 里的快捷方式 .lnk 文件。它本身是一个单独的文件,而这个文件的内容是它所指向的文件的路径。一般的程序存取 symbolic link 时存取的并不是它本身的内容,而是它所指向的文件的内容。当某个文件被删除掉后,它的 symbolic link 就无法存取到这个文件了,因为文件本身已经被删除了。也就是说,一个文件的 symbolic link 跟此文件的文件名或者内容都是完全不同的两个东西。Symbolic link 可以链接任何本地可以访问到的文件或者目录路径。

OK,概念解释清楚了。那么,NTFS 3.0 (Windows 2000 使用的 NTFS 的版本)事实上是支持 hard link 和 symbolic link 的,虽然 Windows 里没有比较容易使用的相关工具,而且 Explorer 对待 symbolic link 也有很奇怪的行为。

在 Windows 2000 及以上版本里可以使用 fsutil hardlink create 这个复杂的命令来创建一个 hard link,用法倒是很简单:



  1. fsutil hardlink create <新文件名> <现有文件名>
复制代码


也可以使用 GNU utilities for Win32 中的 ln 来创建 hard link。这是一些 GNU 工具的 Win32 移植版本,非常好用。另外 Cygwin 里的 ln 不但可以创建 hard link 也可以创建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件)。

当然,如果你想在自己的程序里创建 hard link,那也是很容易的,只需要一个很简单的 API 函数:


  1. BOOL CreateHardLink(
  2.   LPCTSTR lpFileName,
  3.   LPCTSTR lpExistingFileName,
  4.   LPSECURITY_ATTRIBUTES lpSecurityAttributes
  5. );
复制代码


前两个参数的意思就不用解释了,最后一个参数的用途暂时保留,必须为 NULL。

对于 symbolic link,NTFS 只支持对目录的 symbolic link,微软把它称作 junction。但是对于文件的 symbolic link,微软也有提供解决方案,那就是快捷方式(Shortcut,.lnk 文件)。不过 symbolic link 和快捷方式不是一个层次上的东西,前者是底层文件系统的功能,后者是应用层的功能。

在“管理工具”中的“计算机管理”里的“磁盘管理”里我们可以将一个卷装载到一个 NTFS 卷上的某个空目录里,这实际上就是为被装载卷的根目录建立一个以该空目录名为名的 symbolic link。也可以用命令行工具 MOUNTVOL 来完成这项工作。

遗憾的是 Windows 并没有提供对 NTFS 的 symbolic link 完整支持的工具。“计算机管理”或者 MOUNTVOL 只能对某个卷的根目录创建 symbolic link,而不是对任意目录。幸运的是我们可以使用 Sysinternals 提供的带有源代码的免费命令行工具 junction.exe 来全功能的完成对 NTFS symbolic link 的管理。当然,微软也还不至于太莫名其妙,它在 Windwos 2000 Resource Kit 里提供了一个命令行工具 linkd.exe 来完成这件事。不过它的查看 symbolic link 信息的功能不如 junction,因为不支持通配符和子目录扫描。

需要注意的是,Explorer 对待 symbolic link 有一个很奇怪的行为。那就是,在 Explorer 里一个 symbolic link 跟被它 link 的目录没有区别,删除这个 symbolic link 将会删除被 link 的目录下的所有文件!而著名的强大的方便的扩展性强的(原谅我在这里用了这么多修饰词,我确实太喜欢 TC 了。)文件管理工具 Total Commander 则没有这个问题。

mklink 用法

mklink 只能在命令提示符 “CMD” 中使用。



  1. >mklink /?

  2. 创建符号链接。

  3. MKLINK [[/D] | [/H] | [/J]] Link Target

  4. /D      创建目录符号链接。黙认为文件符号链接。
  5. /H      创建硬链接,而不是符号链接。
  6. /J      创建目录联接。
  7. Link    指定新的符号链接名称。
  8. Target  指定新链接引用的路径
  9. (相对或绝对)。
复制代码


mklink /d 与 mlink /j 的异同

从 mklink 的帮助中可以看到,两者皆可以创建目录链接。

细心的同学可以发现,前者是创建目录链接,而后者是创建目录联接。

一字之差,有何分别?

下面分别用这两种方式为同一目录创建链接:


  1. E:\>mklink /j d:\a c:\a
  2. 为 d:\a <<===>> c:\a 创建的联接

  3. E:\>mklink /d d:\b c:\a
  4. 为 d:\b <<===>> c:\a 创建的符号链接
复制代码


下面显示D分区中的文件及目录列表:

E:\>dir d: /a

驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884
D:\ 的目录

2009/06/11  10:00    <DIR>          $RECYCLE.BIN
2009/06/11  13:33    <SYMLINK>      1.txt [c:\a\1.txt]
2009/06/11  13:34    <JUNCTION>     a [c:\a]
2009/06/11  13:35    <SYMLINKD>     b [c:\a]
2009/06/11  12:54    <DIR>          Program Files
2009/06/11  09:58    <DIR>          System Volume Information

1 个文件              0 字节
5 个目录 31,089,442,816 可用字节


mklink 不加参数或加参数  /d  时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。

当加参数  /j  时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别:

从最开始的 “ >dir C:\Users\wclu  /a ” 可以看出,微软自家使用的都是<JUNCTION>型,至于为何,留待考证。

Junction和symbolic link的比较

Junction其实比symbolic link要古老,从2000就开始支持,symbolic link是从vista开始支持的。

Junction只能做目录链接,而且只支持本地目录。

symbolic link不仅可以做目录和文件链接,更NB的是还支持做网络链接(SMB)。虽说可以跨文件系统,但前提是目标系统也要支持symbolic link。。。


来源:http://apps.hi.baidu.com/share/detail/32922322
IsaacZ的发言中如果提到任何字母缩写或专有名词,在本论坛中一般都能搜索到。点此立即搜索点拨论坛。如有搜索不到的,请尝试搜索百度百科,或者跟帖提问。
发帖前请注意看置顶帖。如果你发现自己的问题没有得到回答,说明你的问题提错了地方或者提问前未先阅读本版规则固顶帖011号
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|点拨论坛

GMT+8, 2024-5-4 09:46 , Processed in 0.166645 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表