让 Windows 实现文件镜像:符号链接、硬链接、软链接

December 09, 2023
测试
测试
测试
测试
4 分钟阅读

前言

之前有想过,将文件放入 Onedrive 中备份,但是 Onedrive 备份只能实现固定的几个文件夹,而不是用户自己选择的文件夹。如果要将文件全部存入 Onedrive 能备份的文件夹中,或者是将文件直接放入 Onedrive 的文件夹,这样十分的不优雅。

曾经我就想过,是否可以让文件镜像,实现我修改其中一端,然后双端同步,这样可以实现不少功能

那么这些玩意是什么呢?

硬链接允许在不同位置使用相同的文件,就像复制一个文件的入口。

打开你的系统盘,在根目录使用 Shift + 右键的方式进入 PowerShell,键入 dir -force 来列出所有的文件和文件夹。其中一定会有名为 Documents and Settings 的文件夹,在名称后面有一个箭头指向了 C:\Users。该文件夹的作用是:当应用想要访问 C:\Documents and Settings 这个路径时,系统会自动将它引导到 C:\Users,应用可以用 Documents and Settings 这个目录名访问 Users 下的任何内容。

这是微软为了保证 Windows Vista 以前的应用仍然能够正确安装在 Windows 10 上所做的设计,此文件夹正类似于符号链接。

软链接(交接点 、再分析点)

软连接就像创建一个快捷方式,将访问的文件引导到另一个文件或文件夹,他不会占用多余的空间,可以跨越不同的卷(分区或驱动器)创建。

只适用于目录。只能使用绝对路径。即使创建时使用了相对路径,保存到NTFS中时将隐式转换成绝对路径。

但是,软链接只有在访问它们时才会反映出目标文件的更改。所以,我们用的少。

准确的说,对交接点内文件和子目录的“建立、删除、修改”等操作都被映射到对应的目录中的文件和子目录上,对交接点的“复制、粘贴、剪切、配置 ACL”,只会影响此交接点,在同一卷内移动交接点,只会影响此交接点,但在不同卷间移动交接点,会将此交接点转换为正常目录,并且交接点对应目录下的所有内容都会被移动。

举个例子,比如说 Vista 的 “C:\Documents and Settings” 是指向 “C:\Users” 的 junctionpoint ,这样一些使用了硬编码 “C:\Documents and Settings” 的老程序可以在Vista上正常工作。

简单的说,就像在桌面上放置的图标,点击它会打开一个文件或文件夹。这是软连接的概念,它只是一个指向目标的链接。想象一下,您在电脑上有一个文件夹,如果希望在另一个文件夹中也能够访问它。软连接可以让创建一个类似的“快速通道”,无需在每个位置都复制文件夹。如果正在使用的应用程序有新版本,那就可以为新版本创建一个软连接。这意味着我们可以轻松切换到新版本,而不需要删除旧版本或占用额外的存储空间。

如果要创建一个像快捷方式一样的链接,并且希望跨越不同卷或文件系统,就可以使用软连接。

硬链接

硬链接就没这么麻烦,因为文件管理器上的几乎所有文件都可以被看作是硬链接。

如果文件更改,所有硬链接都会同步更新,因为它们都指向同一份数据。

如果想要在不同位置共享相同的数据文件,使用硬链接。

本身无文件,为文件创建多入口。由于不同的文件指向的是同样的数据,所以无论给同一个文件创建多少个硬链接,他们占整个卷的数据大小都是一样的。

只适用于文件,只能使用绝对路径,不能跨盘符使用。

符号链接

前面说道,文件是数据对象和文件路径的链接,符号链接则是将自己链接到一个目标文件或目录的路径上。当系统识别到符号链接时,它会跳转到符号链接所指向的目标中去,而不改变此时的文件路径。

符号链接像一个虫洞:当用户或应用要访问此虫洞时,就会被传送到符号链接所指向的地方,但他们是通过虫洞访问此目标的,所以其路径仍是虫洞自己的路径,这是它和快捷方式在效果上的区别所在。

更进一步说,符号链接的名称或者后缀丝毫不会影响到其目标。如果有一个图片 cats.jpg,我为它创建一个叫做 cats.docx 的符号链接,双击 cats.docx 时,仍然会出现一个图片。

简单的说,这就像是在地图上放置一个大箭头,告诉您如何去一个地方。但是,这个箭头不会带您过去,它只是告诉您要去哪里。您可以使用符号链接来连接不同的文件夹或文件,就像把这个大箭头放在一个地方,但不会真的把您带到那里。

符号链接是一种创建链接到文件或文件夹的特殊方式,类似于快捷方式,符号链接会自动更新以反映目标文件/文件夹的更改,如果目标文件更改,符号链接也会相应地更新,指向新的目标位置,如果想要创建链接到其他卷上的目录,并且可以让文件系统知道这是一个链接,使用符号链接。

专业的说,符号链接是对文件或目录的引用,实际上符号链接本身是一个“记录着所引用文件或目录的绝对或相对路径”的特殊文件,通过符号链接的操作都会被重定向到目标文件或目录。对符号链接和快捷方式的“读、写、遍历”等操作都会被重定向到目标文件或目录,但对它们的“复制、删除、移动、配置 ACL”等操作只针对自身。

他与其他链接的区别是,创建符号链接不仅可以当作快捷方式使用,最重要的是重定向链接符可以被程序读取然后重定向真正的位置,这是快捷方式无法做到的。

注意

硬链接和软链接有相似之处,但它们的工作方式和一些特点是不同的,因此它们并不完全相同。

相似之处:

  • 都允许在不同的位置创建链接,以便访问相同的文件或目录。
  • 都可以节省存储空间,因为它们共享实际的文件数据。

不同之处:

  • 实现方式:硬链接是通过在文件系统中创建额外的目录入口来实现的,这个入口指向相同的物理文件数据。软链接是一个特殊的文件,其中包含指向目标文件或目录的路径。
  • 跨卷支持:硬链接只能在同一卷(分区或驱动器)内创建。软链接可以跨越不同的卷(分区或驱动器)创建。
  • 目标文件的更改:如果目标文件更改,硬链接会同步更新,因为它们指向相同的数据块。软链接只有在访问它们时才会反映出目标文件的更改。
  • 权限和特殊要求:硬链接不需要额外的权限。符号链接可能需要管理员权限或特殊权限,因为它们可以跨越不同的卷。

因此,尽管硬链接和软链接在某些方面类似,但它们在实现方式、跨卷支持、目标文件更改的同步性以及权限等方面有所不同。

链接对比

内容

硬链接

软链接

符号链接

作用

为某文件创建别名,可让不同的路径对应同一个文件的数据。

在不同位置使用相同的文件

创建到文件或文件夹的特殊链接,类似于快捷方式

链接到文件

✔️

链接到文件夹

✔️

✔️

需要提升为管理员权限

需要

不需要

通常需要(见下方说明)

跨驱动器卷(盘符)

✔️(仅本地计算机)

✔️(包括 SMB 文件或路径)

操作系统支持

Windows NT 3.1 开始支持Windows 2000 开始有 API CreateHardLink()Windows NT 6.0 开始能使用 mklink /H

Windows 2000+

Windows Vista+

可链接到不存在的目标

✔️

✔️

可链接到相对目录

❌(可以使用相对路径创建,但创建完即变绝对路径)

✔️

删除方法

del

rd

rd / del

当链接被单独删除后

只有所有指向原始文件的硬链接和原始文件全部删除后文件数据才会被删除。

Windows Vista 之后原始文件夹不受影响;Windows 2000/XP/2003 会导致原始子文件夹被删除。

原始文件夹不受影响。

当原始文件被单独删除后

硬链接依然能正常访问到文件的数据。

目录联接失效,指向不存在的目录。

符号链接失效,指向不存在的目录。

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

使用方法

mklink

这种方法只能在 CMD 中使用,无法在 Powershell 中使用

> mklink
创建符号链接。

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

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

示例

创建软连接

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

创建符号链接

mklink /D to from

New-Item

示例

创建硬链接

New-Item Hardlink.txt -ItemType HardLink -Target C:\...\Demo.txt

创建符号链接

New-Item [链接名称] -Itemtype SymbolicLink -Target [目标绝对路径]

第三方客户端

这里推荐一个较为强大的第三方客户端:LSE(linkshellextension)https://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html

在拖拽菜单中,可以直接使用

在正常的右键菜单中也可以使用

实现 Onedrive 自动备份文件

知道了上面这些原理,实现起来就非常简单了

New-Item xxx:/xxx/xxx/xxx/超级学习资料 -Itemtype SymbolicLink -Target xxx:/xxx/xxx/xxx/onedrie/xxx

或者用 mklink

mklink /D to xxx:/xxx/xxx/xxx/onedrie/xxx

也可以直接用 linkshellextension

将文件拖动再选择 符号链接 ,完成!

参考文献

https://sspai.com/post/66834

https://blog.walterlv.com/post/ntfs-link-comparisons.html

https://www.zywvvd.com/notes/system/windows/windows-link/windows-link/

https://blog.csdn.net/u010977122/article/details/86523123

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多