比较 Windows 上四种不同的文件(夹)链接方式(NTFS 的硬链接、目录联接、符号链接,和大家熟知的快捷方式)

可能有很多小伙伴已经知道通过 mklink 命令来创建 NTFS 磁盘上的各种链接;当然,就算不知道 mklink 的链接,快捷方式应该每个人都知道吧。mklink 的选项有很多种,但你可能在其他文章中难以找到对这些不同选项的不同效果和使用限制的准确和统一描述。本文将介绍 Windows 系统中所有的链接方式,它们的优缺点、使用条件和坑。

This post is written in multiple languages. Please select yours:

中文 English

不同的链接方式

Windows Vista 开始带来了 NTFS 符号链接(Symbolic Link),Windows 2000 开始就有了 NTFS 重解析点(Reparse Point),更早的 Windows 95 就有了快捷方式(Shortcut),再往前到 Windows 3.5 还有硬链接(Hard Link),他们都能实现给你不同的路径访问同一个文件或文件夹的功能。

mklink

使用 mklink 命令,你可以创建“硬链接(Hard Link)”、“目录联接(Junction Point)”和“符号链接(Symbolic Link)”。

例如:

即在当前目录创建了一个指向 %APPDATA%\walterlv\packages\1.0.0 的目录联接。

因为创建目录联接不需要管理员权限,所以特别适合给桌面应用程序用来按版本管理某些包/工具集。有关使用 .NET/C# 来创建目录联接的方法,可以阅读我的另一篇博客:

快捷方式

快捷方式是一个单纯 Windows 操作系统用户层面的功能,与 NTFS 文件系统没有什么关系。不过其也能实现链接到另一个文件的功能。使用快捷方式的程序太多了,几乎每个安装包都会考虑往桌面或开始菜单扔几个快捷方式。

快捷方式的本质是一个 lnk 后缀的文件,这个文件里面指向了如何打开目标文件或文件夹的一些参数,于是当在文件资源管理器中打开快捷方式时,就直接打开了目标文件或文件夹(当然,启动一个程序可能是大多数用法)。

其他

重解析点(Reparse Point)自 NTFS v3.0(随 Windows 2000 推出)开始便一直存在于 Windows 操作系统中。除了我们前面提到的可通过 mklink 创建的那三种外,还有其他种类:

  • Volume Mount Ppoints
  • Distributed Link Tracking(DLT)
  • Data Deduplication
  • Hierarchical Storage Management(HSM)
  • Native Structured Storage(NSS)
  • Unix Doman Socket(socket)
  • System Compression
  • OneDrive

比较

可能单单说名字,你不一定能明白什么时候要用哪一种。于是我将这些链接的不同整理了出来贴在下面。

硬链接(Hard Link)

目录联接(Junction Point)

符号链接(Symbolic Link)

命令

mklink /H Link Target

mklink /J Link Target

mklink /D Link Target

作用

为某文件创建别名,可让不同的路径对应同一个文件的数据。

链接到文件

✔️

链接到文件夹

✔️

✔️

需要提升为管理员权限

需要

不需要

通常需要 [坑1]

跨驱动器卷(盘符)

✔️(仅本地计算机)

✔️(包括 SMB 文件或路径)

操作系统支持

Windows NT 3.1 开始支持Windows 2000 开始有 API CreateHardLink()Windows NT 6.0 开始能使用 mklink /H

Windows 2000+

Windows Vista+

可链接到不存在的目标

✔️

✔️

可链接到相对目录

❌(可以使用相对路径创建,但创建完即变绝对路径)

✔️

删除方法

del

rd

rd / del

当链接被单独删除后

只有所有指向原始文件的硬链接和原始文件全部删除后文件数据才会被删除。

Windows Vista 之后原始文件夹不受影响;Windows 2000/XP/2003 会导致原始子文件夹被删除。

原始文件夹不受影响。

当原始文件被单独删除后

硬链接依然能正常访问到文件的数据。

目录联接失效,指向不存在的目录。

符号链接失效,指向不存在的目录。

[坑1]: 在微软的官方博客中已有说明:从 Windows 10 Insiders build 14972 开始,符号链接对开发者将不再需要管理员权限,这可以让开发者像在 Linux 或 macOS 上一样高效地工作。(通过如下图所示的开关来决定此操作是否需要管理员权限,打开则无需管理员权限。)

开发者模式

开发者模式

额外的坑

如果你在开始菜单里面有快捷方式指向了一个目录联接(Junction Point)中的文件,那么在 Windows 10 操作系统更新后这个快捷方式便会消失。目前正在调查消失的原因,如果确认是目录联接的 bug 或者开始菜单的 bug,就将进展报告给微软。

关于这个 bug,详见:

一般来说,阅读本文应该就理解了 mklink 的正确用法,也不应该会出现我另一篇博客中的情况:

另外,附我使用目录联接/符号链接的一些用途:

参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/ntfs-link-comparisons.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])

Link Shell Extension 是一个可以在 NTFS 文件系统中创建“硬连接”的 Windows 资源管理器扩展。“硬连接”让一个文件在多个目录下重复出现,但只占用一份文件的空间。例如,一个大小为 10MB 的“E:\a.doc”的文件,创建一个硬连接到“E:\共享文件夹\a.doc”中,则两个“a.doc”文件只占用一个文件的空间(10MB),两个文件的内容当然是完全一样的。如果编辑该文件的编辑器在修改保存文件时,依然保持源文件NTFS 文件夹中的位置,那么在“E:\a.doc”上所作的改动会自动反映到“E:\共享文件夹\a.doc”中。同理,修改了“E:\共享文件夹\a.doc”文件后,所作的修改也会立即反映到硬连接对应的“E:\a.doc”文件。“硬连接”还可以用于目录,这称为“目录连接点”(Junction)。例如,可以为“C:\Applications”目录创建一个硬连接到“E:\共享文件夹\Applications”,则两个目录共享同样的存储空间,在“C:\Applications”目录中对任何文件所作的改动都会立即反映到“E:\共享文件夹\Applications”目录中对应的文件中去。同理,修改“E:\共享文件夹\Applications”目录中的文件,改动也会立即反映到“C:\Applications”目录中去。创建硬连接之后,删除硬连接的副本(即连接点)只会将文件系统对文件数据的引用减一,只有删除所有的引用时,才真正删除文件。安装方法: 1、到主页下载安装文件,执行安装; http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html#contact 2、使用资源管理器打开 Link Shell Extension 所安装到的目录,将“HardlinkShellExt.dll”重命名为其他名称的文件; 3、将汉化文件解压到该目录; 4、注销(或重启)后重新登录到 Windows。创建硬连接的操作方法: 1、在 Windows 资源管理器中,找到需要创建硬连接的文件,如 “E:\a.doc”; 2、右键点击该文件,选择“选定源连接点”。 3、转到需要创建连接点的地方,如“E:\共享文件夹”。 4、右键点击资源管理器文件列表的空白位置,选择“创建硬连接”(如果是目录,可选择“创建连接点→目录连接点[或其他选项]”)——在资源管理器的状态栏中对操作命令有说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值