在 linux 系统里,通常可以用 ln
指令创建文件链接。而在windows中,其实也是有类似的指令,可以实现文件链接。
说明一下,我自己的电脑操作系统是win10,虽然理论上mklink能够在win7上使用,但是以下结论并没有在win7上面实践。
命令行指令为 New-Item
,别名 ni
, 具体可以查看 Microsoft Doc - New-Item 。
我自己实测的时候,发现这里面还是有一些坑,下面简单描述。
快捷方式 or 软链接 or 硬链接
我不懂太多术语,只是描述一下我在实测中感受到的他们的区别。
首先是扩展名:
“快捷方式” 拥有统一的扩展名 .lnk
,其对应的文件类型为 “快捷方式”,就我个人感觉,这玩意应该是windows特有的吧。
“软链接” 我认为没有自己的扩展名,我这么说,是感觉这东西还是源于 “*nix”系统,这些系统并不总是依靠文件扩展名来区分文件类型,没有扩展名的文件同样可以标记为 “Executable”,同样的功能在windows里实现会很蹩脚或无法实现。在我实测中,有时软链接的映像文件带了扩展名,反而无法正常打开(没错,我说的就是 可执行程序 的映像)。软链接的文件类型统一为 “.symlink”。
“硬链接” 我认为是要和源文件保持一致。硬链接的文件类型与源一致。
其次是 映像 和 源(目标文件) 之间的关系:
“快捷方式” 这东西按照windows的规则打开,执行,并且在一定程度上,能够传递参数。
“软链接” 这玩意就是一个影子吧,比 “快捷方式” 要更像是影子,创建了软链接后,可以注意到,映像文件是没有大小的,文件大小和占用空间始终是 0字节 。如果源文件是命令行程序,则命令行标题为映像文件名,而实际开启的进程名为源文件名。包括反向寻找进程文件,也会导向到源文件处。
“硬链接” 这个比较特殊,我认为确实是创建了一个 源文件的副本,而映像和源又能够保持同步,在一边的内容发生改变时,另一边能够同步这些变化。然而,只有 硬链接 能够在源文件被删除掉后,仍然拥有内容,能够被打开。如果源文件是可执行程序,那么,从映像文件启动时,该进程的WorkDirectory会默认设置为映像文件所在文件夹。
创建方法
利用 New-Item
创建
“快捷方式” 这个太方便了,基本就是windows给用户用的。创建的方法也有很多,比如按住alt键再用鼠标拖拽等,这里不细说。
“软链接” 使用 New-Item
指令为:
PS C:\>New-Item -ItemType SymbolicLink -Path C:\image -Target C:\source.txt
这样,就为 C:\source.txt
创建了一个名为 image
的软链接映像。双击这个名为 image
的文件,即可打开。
“硬链接” 使用 New-Item
指令为:
PS C:\>New-Item -ItemType HardLink -Path C:\image.txt -Target C:\source.txt
这样,就为 source.txt
创建了一个名为 image.txt
的硬链接映像。
“Junction” windows中文件与文件夹是完全不同的两种类型,创建文件夹链接不可以使用 HardLink
,但是可以使用 Junction
。
PS C:\>New-Item -ItemType Junction -Path C:\test_image -Target C:\test_source
利用 msys 创建
还有一个偏门的方法,就是利用msys中的指令集来创建,msys中是附带有linux指令集的,也就包含有 ln
这个指令。结果和上面的方法基本一致。
利用cmd创建
PowerShell和CMD使用的是不同指令集。CMD的指令理论上在win7上也能使用。在CMD中可以使用 mklink
指令来创建链接。直接敲入这个指令可以看到使用帮助信息:
C:\>mklink
创建符号链接。
MKLINK [[/D] | [/H] |[/J]] Link Target
/D 创建目录符号链接。默认为文件符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录链接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径(绝对或相对)。