.NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)

2023-10-22 10:49:08 浏览数 (1)

我们知道 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]) 。

0 人点赞