当前位置: 首页 > news >正文

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

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


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

{% include post-version-selector.html %}

本文内容

    • 不同的链接方式
      • `mklink`
      • 快捷方式
      • 其他
    • 比较
    • 额外的坑

不同的链接方式

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)”。

> mklink
创建符号链接。

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

        /D      创建目录符号链接。默认为文件
                符号链接。
        /H      创建硬链接而非符号链接。
        /J      创建目录联接。
        Link    指定新的符号链接名称。
        Target  指定新链接引用的路径
                (相对或绝对)

例如:

mklink /J current %APPDATA%\walterlv\packages\1.0.0

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

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

  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction) - walterlv

快捷方式

快捷方式是一个单纯 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 Targetmklink /J Link Targetmklink /D Link Target
作用为某文件创建别名,可让不同的路径对应同一个文件的数据。
链接到文件✔️
链接到文件夹✔️✔️
需要提升为管理员权限需要不需要通常需要 [坑1]
跨驱动器卷(盘符)✔️(仅本地计算机)✔️(包括 SMB 文件或路径)
操作系统支持Windows NT 3.1 开始支持
Windows 2000 开始有 API CreateHardLink()
Windows NT 6.0 开始能使用 mklink /H
Windows 2000+Windows Vista+
可链接到不存在的目标✔️✔️
可链接到相对目录❌(可以使用相对路径创建,但创建完即变绝对路径)✔️
删除方法delrdrd / del
当链接被单独删除后只有所有指向原始文件的硬链接和原始文件全部删除后文件数据才会被删除。Windows Vista 之后原始文件夹不受影响;Windows 2000/XP/2003 会导致原始子文件夹被删除。原始文件夹不受影响。
当原始文件被单独删除后硬链接依然能正常访问到文件的数据。目录联接失效,指向不存在的目录。符号链接失效,指向不存在的目录。

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

开发者模式

额外的坑

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

关于这个 bug,详见:

  • After the windows 10 updates, all shortcuts of scoop will disappear. · Issue #3941 · lukesampson/scoop

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

  • 解决 mklink 使用中的各种坑(硬链接,软链接/符号链接,目录链接) - walterlv

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

  • 通过 mklink 收集本地文件系统的所有 NuGet 包输出目录来快速调试公共组件代码 - walterlv

参考资料

  • NTFS reparse point - Wikipedia
  • windows - What is the difference between NTFS Junction Points and Symbolic Links? - Stack Overflow
  • Hard link - Wikipedia
  • Create symbolic links (Windows 10) - Windows security - Microsoft Docs
  • Symlinks in Windows 10! - Windows Developer Blog

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

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

相关文章:

  • 了解 Windows Linux 下命令行 Shell 启动程序传参的区别,这下不用再担心 Windows 下启动程序传参到 Linux 下挂掉了
  • 适合 .NET 开发者用的 GitHub Actions(时不时更新)
  • 在 CMD 里根据进程名杀掉进程
  • 在 PowerShell 里根据进程名杀掉进程
  • 在制作多框架项目的 NuGet 包时应该注意的问题(buildMultiTargeting TargetFrameworks)
  • 专业团队:推荐一个网站,生成巨幅文字注释
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • 通过设置启用 Visual Studio 默认关闭的大量强大的功能提升开发效率
  • 使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景(可以做 Acrylic 亚克力效果、模糊效果、主题色效果等)
  • input 不能为空 js_我用JS刷LeetCode | Day 9 | Implement strStr()
  • 宝塔同时安装苹果cms海洋cms_maccms安装了后接下来做什么?
  • hive 修改表的存储格式_Hive存储格式
  • mac redis 链接_2018 MAC下安装Redis和Redis可视化工具RDM并连接Redis
  • python的lib文件夹在哪_如何导入模块中的lib文件夹
  • heidisql连接不是本地_本地备份与云备份:选择您的备份计划
  • [笔记] php常见简单功能及函数
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android开源项目规范总结
  • Electron入门介绍
  • GitUp, 你不可错过的秀外慧中的git工具
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Javascript 原型链
  • JSONP原理
  • Octave 入门
  • PHP 7 修改了什么呢 -- 2
  • Python打包系统简单入门
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue自定义指令实现v-tap插件
  • windows下mongoDB的环境配置
  • Zsh 开发指南(第十四篇 文件读写)
  • 从输入URL到页面加载发生了什么
  • 多线程 start 和 run 方法到底有什么区别?
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 高度不固定时垂直居中
  • 技术胖1-4季视频复习— (看视频笔记)
  • 利用DataURL技术在网页上显示图片
  • 聊聊flink的TableFactory
  • 面试遇到的一些题
  • 详解NodeJs流之一
  • ​linux启动进程的方式
  • ![CDATA[ ]] 是什么东东
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (30)数组元素和与数字和的绝对差
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (九)c52学习之旅-定时器
  • (七)Java对象在Hibernate持久化层的状态
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (算法)Travel Information Center
  • (一)SpringBoot3---尚硅谷总结
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .Net 应用中使用dot trace进行性能诊断
  • .NET4.0并行计算技术基础(1)