我们知道 Windows 系统 NTFS 文件系统提供了硬连接功能,可以通过 mklink
命令开启。如果能够通过代码实现,那么我们能够做更多有趣的事情。
本文提供使用 .NET/C# 代码创建 NTFS 文件系统的硬连接功能(目录联接)。
目录联接
以管理员权限启动 CMD(命令提示符),输入 mklink
命令可以得知 mklink 的用法。
1 2 3 4 5 6 7 8 9 10 11 12 | C:WINDOWSsystem32>mklink 创建符号链接。 MKLINK [[/D] | [/H] | [/J]] Link Target /D 创建目录符号链接。默认为文件 符号链接。 /H 创建硬链接而非符号链接。 /J 创建目录联接。 Link 指定新的符号链接名称。 Target 指定新链接引用的路径 (相对或绝对)。 |
---|
我们本次要用 .NET/C# 代码实现的是 /J
目录联接。实现的效果像这样:
这些文件夹带有一个“快捷方式”的角标,似乎是另一些文件夹的快捷方式一样。但这些与快捷方式的区别在于,应用程序读取路径的时候,目录联接会成为路径的一部分。
比如在 D:WalterlvNuGet
中创建 debug
目录联接,目标设为 D:WalterlvDemoRepobinDebug
,那么,你在各种应用程序中使用以下两个路径将被视为同一个:
D:WalterlvNuGetdebugDemoRepo-1.0.0.nupkg
D:WalterlvDemoRepobinDebugDemoRepo-1.0.0.nupkg
或者这种:
D:WalterlvNuGetdebugpublish
D:WalterlvDemoRepobinDebugpublish
使用 .NET/C# 实现
本文的代码主要参考自 jeff.brown 在 Manipulating NTFS Junction Points in .NET - CodeProject 一文中所附带的源代码。
由于随时可能更新,所以你可以前往 GitHub 仓库打开此代码:
- walterlv.demo/JunctionPoint.cs at master · walterlv/walterlv.demo
使用 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]) 。