Windows支持4种”链接”机制,分别是shortcut、hard link、junction point、symbolic link。本文针对这4种机制进行简要介绍,可作为速查手册存在。
先吐个槽,天朝很多与本问题相关的技术文章,在术语层面相当混乱,作者的一知半解以及不使用规范术语,给本就容易混淆的概念带来更大的误导。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
1
)
shortcut
/快捷方式
以
.
lnk文件方式存在,适用于
Explorer等应用程序。
非
NTFS内置机制,从
Win95开始得到支持。
FAT32支持。
同时适用于文件、目录。
只能使用绝对路径。
可以跨盘符,可以跨主机,可以使用
UNC路径、网络驱动器。
删除
shortcut,不影响
target。
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
2
)
(
file
)
hard
link
假设本文读者具有
*
nix基础,此处不做
hard
link的语义解释。
NTFS内置机制,从
Windows
NT
4开始得到支持。
FAT32不支持。
只适用于文件。
只能使用绝对路径。
hard
link与
target
file必须位于同一
volume,可以简单理解成不能跨盘符。
在
Explorer中删除
hard
link,不影响
target
file。
删除
target
file,不影响
hard
link。事实上由于
hard
link的语义,此时剩下的
hard
link就是原始数据的唯一访问点。
相关
Win32
API
:
CreateHardLink
(
)
CreateHardLinkTransacted
(
)
创建
:
mklink
/
H
"hard link name"
"target file"
fsutil
.
exe
hardlink
create
"hard link name"
"target file"
查看
:
fsutil
.
exe
hardlink
list
"hard link name"
fsutil
.
exe
hardlink
list
"target file"
二者效果一样,
hard
link的语义本就如此。
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
3
)
(
directory
)
junction
point
/
soft
link
/
reparse
point
junction
point也叫
soft
link,这是微软官方文档里说的
:
Hard
Links
and
Junctions
https
:
//msdn.microsoft.com/en-us/library/windows/desktop/aa365006
junction
point的底层机制是
NTFS的
reparse
point
:
Reparse
Points
https
:
//msdn.microsoft.com/en-us/library/windows/desktop/aa365503
Junction
v1
.
06
http
:
//www.sysinternals.com
http
:
//technet.microsoft.com/en-us/sysinternals/default.aspx
https
:
//technet.microsoft.com/en-us/sysinternals/bb896768
How
to
create
and
manipulate
NTFS
junction
points
https
:
//support.microsoft.com/en-us/kb/205524
NTFS内置机制,从
Windows
2000
/
XP开始得到支持。
只适用于目录。
Vista的
"C:\Documents and Settings\"是指向"
C
:
\
Users
\"的
junction
point,这样一些使用了硬编码
"C:\Documents and Settings\"的老程序可
以在Vista上正常工作。
只能使用绝对路径。即使创建junction point时使用了相对路径,保存到NTFS中时将
隐式转换成绝对路径。
junction point必须与target directory位于同一local computer,可以简单理解成
不能跨主机。不能使用UNC路径;假设Z是通过网络映射生成的盘符,同样不适用于Z。
在local computer范围内,可以跨盘符。
在Explorer中删除junction point,有两种情况。对于Windows 2000/XP/2003,会同
步删除target directory,这真是一个奇葩的行为。注意,我们强调,在Explorer中
删除,高版本的Total Commander没有这个奇葩行为。对于Vista及之后版本,不影响
target directory,这才是人类所能理解的行为。
删除target directory,junction point仍将存在,但失效了,变得不可用。这个很
好理解,因为此时junction point指向不存在的目录。
diskmgmt.msc
右键选中某volume
更改驱动器号和路径
添加
装入以下空白NTFS文件夹中
这个功能用的就是junction point机制,还可以用mountvol.exe完成操作。
创建:
mklink /J "
junction
point
name
" "
target
directory
" // 生成的Reparse Data相比junction.exe要多
linkd.exe "
junction
point
name
" "
target
directory
" // Windows Resource Kits
查看:
dir /A:L /S "
path
"
fsutil.exe reparsepoint query "
junction
point
name
" // 有Reparse Data的16进制转储
linkd.exe "
junction
point
name
" // 不能查看junction.exe生成的"
junction
point
"
删除:
fsutil.exe reparsepoint delete "
junction
point
name
" // 不建议使用
linkd.exe "
junction
point
name
" /D // 可以删除junction.exe生成的"
junction
point
"
它这个行为不是我们期望的效果,比如"
target
directory
"下有普通文件,上述命令
会删除"
junction
point
"下的普通文件,但不会删除"
junction
point
",同时
"
target
directory
"下的普通文件仍然存在。这个效果我不能理解。在Explorer中操
作无法达到这种效果。
sysinternals的junction.exe:
junction.exe "
junction
point
name
" "
target
directory
" // 创建
junction.exe "
junction
point
name
" // 查看
junction.exe -q -s "
path
" // 递归查看
junction.exe -d "
junction
point
name
" // 删除
我猜junction.exe提供-d参数,就是因为Windows 2000/XP/2003的Explorer奇葩行为,
这个-d不影响target directory。
示例:
"
dir
/
A
:
L
/
S
c
:
\
2009
/
07
/
14
13
:
08
"JUNCTION"
Documents
and
Settings
[
C
:
\
Users
]
"junction.exe "
C
:
\
Documents
and
Settings
"
C:\Documents and Settings: JUNCTION
Print Name : C:\Users
Substitute Name: C:\Users
"
junction
.
exe
-
q
-
s
c
:
\
\
\
?
\
c
:
\
\
Documents
and
Settings
:
JUNCTION
Print
Name
:
C
:
\
Users
Substitute
Name
:
C
:
\
Users
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
4
)
symbolic
link
Symbolic
Links
https
:
//msdn.microsoft.com/en-us/library/windows/desktop/aa365680
symbolic
link不是
soft
link,不要跟着
SB瞎起哄。
NTFS内置机制,从
Vista开始得到支持。
同时适用于文件、目录。这是一种超级
shortcut。
可以使用相对、绝对路径。假设创建
symbolic
link时使用了相对路径,保存到
NTFS
中的就是相对路径,不会隐式转换成绝对路径。
可以跨盘符,可以跨主机,可以使用
UNC路径、网络驱动器。
在
Explorer中删除
symbolic
link,不影响
target。
删除
target,
symbolic
link仍将存在,但失效了,变得不可用。
相关
Win32
API
:
CreateSymbolicLink
(
)
CreateSymbolicLinkTransacted
(
)
创建
:
mklink
"file symbolic link name"
"target file"
mklink
/
D
"directory symbolic link name"
"target directory"
注意不指定
/
D时创建
file
symbolic
link,指定
/
D创建
directory
symbolic
link。
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
|