http://blog.nsfocus.net/shortcuthard-linkjunction-pointsymbolic-link/

Windows支持4种”链接”机制,分别是shortcut、hard link、junction point、symbolic link。本文针对这4种机制进行简要介绍,可作为速查手册存在。

先吐个槽,天朝很多与本问题相关的技术文章,在术语层面相当混乱,作者的一知半解以及不使用规范术语,给本就容易混淆的概念带来更大的误导。

Windows支持4种”链接”机制,分别是shortcut、hard link、junction point、symbolic link。本文针对这4种机制进行简要介绍,可作为速查手册存在。

先吐个槽,天朝很多与本问题相关的技术文章,在术语层面相当混乱,作者的一知半解以及不使用规范术语,给本就容易混淆的概念带来更大的误导。

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

 

Windows硬链接 软链接 符号链接 快捷方式的更多相关文章

  1. UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接

    lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...

  2. WINDOWS 的 MKLINK : 硬链接,符号链接 : 文件符号链接, 目录符号链接 : 目录联接

    玩转WIN7的MKLINK 引言: 换了新电脑,终于再次使用上啦WIN7 ,经过一个周每天重装N次系统,... ... ... ... 在xp系统下,junction命令要用微软开发的小程序 junc ...

  3. Linux硬链接和符号链接(转)

    Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]  硬连接指通过索引节点来进行连接.在Li ...

  4. linux 硬链接 软链接

    硬链接 链接文件的INode和源文件相同,删除互不影响,不支持跨分区,不支持目录 软链接 链接文件有单独的INode,其Block中存储源文件的INode信息,相当于windows中 的快捷方式 ln ...

  5. linux笔记-硬链接和符号链接

    硬链接:指多个路径名(不同目录下的不同文件名)指向同一个硬盘数据,用其中的随便哪个文件打开修改数据,都会在其他文件打开中更新, 原因就是硬链接和“原”文件inode相同,每增加或者删除一个链接,链接计 ...

  6. Unix硬链接和符号链接(转)

    首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文 ...

  7. linux下符号链接和硬链接的区别

    存在2众不同类型的链接,软链接和硬链接,修改其中一个,硬链接指向的是节点(inode),软链接指向的是路径(path) 软连接文件 软连接文件也叫符号连接,这个文件包含了另一个文件的路径名,类似于wi ...

  8. 理解 Linux 的硬链接与软链接【转】

    转自:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html 从 inode 了解 Linux 文件 ...

  9. 理解 Linux 的硬链接与软链接(待研究)

    从 inode 了解 Linux 文件系统 硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux ...

随机推荐

  1. Navicat连接mysql出现1045错误

    使用Navicat连接mysql出现1045,可能的原因为忘记密码,下面方法可以帮助重置密码. 1,以管理员权限运行cmd程序: 2,cd C:\Program Files (x86)\MySQL\M ...

  2. ATL编程初级教程(图文事例)(VC6)

    http://blog.csdn.net/titilima/archive/2004/07/18/44273.aspx 介绍 本教程的目的是告诉你如何使用ATL创建一个COM服务器,并使用Visual ...

  3. openstack常用命令-neutron篇

    列出当前租户所有的网络 neutron net-list 列出所有租户的所有网络(需要管理员权限) neutron net-list --all-tenants 创建一个网络(vlan/flat) n ...

  4. pycharm安装pip报错的处理办法

    这几天在用pycharm的时候,发现安装软件的时候报 module 'pip' has no attribute 'main' ,后来综合网上的办法以及分析错误提示,原因是在于pycharm安装目录下 ...

  5. 强大的css3库

    http://www.html5tricks.com/demo/css3-animate-css/index.html 关注微信小程序

  6. ---————for循环打印爱心

    //打印爱心public class Xin{ public static void main (String [] args){ for(int i=1;i<=4;i++){ for(int ...

  7. 如何引入iconfont图标与Element-UI组件

    一.iconfont图标 iconfont方便又好用,介绍一下如何在vue项目中引入iconfont 1.进入iconfont官网 www.iconfont.cn 2.登录自己账户 3.选择图标后下载 ...

  8. java数组的定义

    class ArrayDome { public static void main(String[] args) { //元素类型[] 数组名 创建一个 元素类型[元素个数或数组长度] /* 需要一个 ...

  9. Ubuntu系统下Anaconda使用方法总结

    前言:个人认为Anaconda比pip使用起来要方便很多,因为它创建虚拟环境和下载各种库都很方便.但是有时候conda的安装方法中没有某些库,必须使用pip来进行安装.所以,主要用Anaconda,偶 ...

  10. SQLI DUMB SERIES-15

    (1)无论输入什么都没有回显,但是输入 admin'# 时会显示成功登录,说明闭合方式是单引号 (2)无回显,则使用盲注,可用用时间延迟攻击法. 测试时间延迟是否可行: uname=admin' an ...