我们知道 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\
本文的代码主要参考自 jeff.brown 在 Manipulating NTFS Junction Points in .NET - CodeProject 一文中所附带的源代码。
由于随时可能更新,所以你可以前往 GitHub 仓库打开此代码:
如果希望在代码中创建目录联接,则直接使用:
1 | JunctionPoint.Create("walterlv.demo", @"D:\Developments", true); |
---|
后面的 true
指定如果目录联接存在,则会覆盖掉原来的目录联接。
参考资料
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/mklink-junction-in-dotnet.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。