我们知道 Windows 系统 NTFS 文件系统提供了硬连接功能,可以通过 mklink
命令开启。如果能够通过代码实现,那么我们能够做更多有趣的事情。
本文提供使用 .NET/C# 代码创建 NTFS 文件系统的硬连接功能(目录联接)。
目录联接
以管理员权限启动 CMD(命令提示符),输入 mklink
命令可以得知 mklink 的用法。
1
2
3
4
5
6
7
8
9
10
11
12
C:\WINDOWS\system32>mklink
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件
符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。
我们本次要用 .NET/C# 代码实现的是 /J
目录联接。实现的效果像这样:
这些文件夹带有一个“快捷方式”的角标,似乎是另一些文件夹的快捷方式一样。但这些与快捷方式的区别在于,应用程序读取路径的时候,目录联接会成为路径的一部分。
比如在 D:\Walterlv\NuGet\
中创建 debug
目录联接,目标设为 D:\Walterlv\DemoRepo\bin\Debug
,那么,你在各种应用程序中使用以下两个路径将被视为同一个:
D:\Walterlv\NuGet\debug\DemoRepo-1.0.0.nupkg
D:\Walterlv\DemoRepo\bin\Debug\DemoRepo-1.0.0.nupkg
或者这种:
D:\Walterlv\NuGet\debug\publish\
D:\Walterlv\DemoRepo\bin\Debug\publish\
使用 .NET/C# 实现
本文的代码主要参考自 jeff.brown 在 Manipulating NTFS Junction Points in .NET - CodeProject 一文中所附带的源代码。
由于随时可能更新,所以你可以前往 GitHub 仓库打开此代码:
使用 JunctionPoint
如果希望在代码中创建目录联接,则直接使用:
1
JunctionPoint.Create("walterlv.demo", @"D:\Developments", true);
后面的 true
指定如果目录联接存在,则会覆盖掉原来的目录联接。
参考资料
- windows - What the C# equivalent of “mklink /J”? - Stack Overflow
- Manipulating NTFS Junction Points in .NET - CodeProject
- Reparse Points - Windows applications - Microsoft Docs
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/mklink-junction-in-dotnet.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。