文件链接全教程
Windows
1. 链接基础概念
在 Windows 中,“链接”实际上有几种形式,主要包括以下几类:
- 符号链接(Symbolic Link,软链接)
- 概念: 符号链接是一个特殊文件,其中保存了目标文件或目录的路径。它类似于 Linux 中的软链接,并且看起来和普通文件或文件夹没有区别。
- 特点:
- 可用于文件和目录
- 可以跨分区甚至跨网络路径(UNC)
- 如果目标被删除或移动,符号链接会失效
- 从 Windows Vista 开始支持,最新 Windows(如 Windows 10/11)中在开发人员模式下可不需要管理员权限创建
- 硬链接(Hard Link)
- 概念: 硬链接是指向同一数据实体(数据块或 NTFS 中的文件记录)的另一个目录项。每个硬链接都与目标文件共享同一份数据。
- 特点:
- 仅适用于文件,不能用于目录
- 必须在同一 NTFS 卷内(不能跨分区)
- 删除其中一个链接不会影响其它链接或数据本身,只有当所有硬链接都删除后数据才会释放
- 目录联接(Junction Point)
- 概念: 目录联接也称为“联接”,用于将一个目录指向另一个目录。在早期版本中常用来兼容旧版 Windows。
- 特点:
- 只适用于目录
- 创建时会自动转换为绝对路径
- 适用于同一台计算机,支持跨盘符(但不支持网络路径)
2. 创建链接的方法
在 Windows 中创建链接主要有两种方式:通过 CMD 命令行(使用 mklink
命令)和通过 PowerShell(使用 New-Item
命令)。
2.1 使用 CMD 命令创建链接
命令语法:
mklink [[/D] | [/H] | [/J]] Link Target
- 默认(无参数):创建文件的符号链接
- /D:创建目录的符号链接
- /H:创建硬链接(仅用于文件)
- /J:创建目录联接(Junction,适用于目录)
示例:
创建文件的符号链接
假设有一个文件C:\Data\original.txt
,我们在同目录下创建一个名为link.txt
的符号链接:mklink C:\Data\link.txt C:\Data\original.txt
此时,
link.txt
实际上保存了original.txt
的路径,当你打开link.txt
时,系统会自动访问original.txt
。创建目录的符号链接
假设有一个目录C:\Data\SourceFolder
,希望在C:\Data
下创建一个符号链接目录LinkFolder
:mklink /D C:\Data\LinkFolder C:\Data\SourceFolder
这样,在资源管理器中打开
LinkFolder
就等同于打开SourceFolder
。创建文件的硬链接
依然以文件C:\Data\original.txt
为例,创建一个硬链接hardlink.txt
:mklink /H C:\Data\hardlink.txt C:\Data\original.txt
硬链接与原文件共享同一数据块,因此修改任一文件都会同步改变内容,但请注意:
- 硬链接只能用于文件
- 必须在同一卷内
创建目录联接(Junction)
使用 /J 参数来创建目录联接,适用于目录,但和符号链接不同的是,Junction 通常保存绝对路径:mklink /J C:\Data\JunctionFolder C:\Data\SourceFolder
使用 Junction 时,删除链接不会删除目标目录中的数据。
注意:
- 创建符号链接和某些操作可能需要以管理员身份运行 CMD。
- Windows 10 及以后版本如果开启“开发人员模式”,可以允许普通用户创建符号链接。
2.2 使用 PowerShell 创建链接
PowerShell 提供了更现代的 New-Item
命令来创建不同类型的链接。
语法及示例:
创建文件或目录的符号链接:
New-Item -ItemType SymbolicLink -Path "C:\Data\Link.txt" -Target "C:\Data\original.txt"
或者创建目录符号链接:
New-Item -ItemType SymbolicLink -Path "C:\Data\LinkFolder" -Target "C:\Data\SourceFolder"
PowerShell 中的
SymbolicLink
同样创建的是软链接,和 CMD 中mklink
默认行为一致。创建文件的硬链接:
New-Item -ItemType HardLink -Path "C:\Data\hardlink.txt" -Target "C:\Data\original.txt"
这会为
original.txt
创建一个硬链接,注意硬链接只能用于文件,且必须在同一卷内。创建目录联接(Junction):
New-Item -ItemType Junction -Path "C:\Data\JunctionFolder" -Target "C:\Data\SourceFolder"
此命令会创建一个指向目录的联接,与符号链接在某些场景下效果类似,但内部处理略有差异。
提示:
- PowerShell 命令执行时也可能需要管理员权限,具体取决于目标路径所在的位置(例如系统文件夹或 Program Files)。
- 在使用相对路径创建符号链接时,系统会将其转换为绝对路径存储在 NTFS 中。
3. 使用场景与注意事项
3.1 常见使用场景
数据备份和增量备份
利用硬链接可以在不占用额外磁盘空间的情况下创建多个访问入口。例如,备份软件(如 Windows 版的“时间机器”)就会使用硬链接来实现增量备份。移动或重定向系统目录
为了节省系统盘空间或实现重装系统不丢失用户数据,可以将如C:\Users
目录复制到其他分区,然后使用 Junction 将原位置重定向到新位置:robocopy "C:\Users" "D:\Users" /E /COPYALL /XJ rmdir "C:\Users" /S /Q mklink /J "C:\Users" "D:\Users"
开发环境下共享资源
当多个项目需要使用同一份库或模型文件时,可以通过符号链接或硬链接共享文件,避免重复存储。
3.2 注意事项
权限问题
- 在 Windows 中,创建符号链接通常需要管理员权限;不过在 Windows 10 开发人员模式下可允许普通用户创建符号链接。
- 硬链接不需要额外的权限,但目标文件必须在同一 NTFS 卷内。
目标失效风险
- 符号链接依赖于目标路径。如果目标移动或删除,符号链接会成为“悬挂链接”(无效链接)。
- 硬链接与目标数据直接关联,即使原始文件名被删除,只要至少还有一个硬链接存在,数据依然可用。
跨分区限制
- 硬链接只能在同一卷内使用,而符号链接和 Junction 则可以跨卷(但符号链接可以支持网络路径,而 Junction 则不行)。
命令使用环境
- 使用
mklink
命令时建议打开管理员命令提示符。 - 使用 PowerShell 时,若涉及系统目录或受保护区域,建议以管理员身份运行 PowerShell。
- 使用
查看链接和删除
直接在资源管理器操作