当前位置: 首页 > news >正文

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

我们知道 Windows 系统 NTFS 文件系统提供了硬连接功能,可以通过 mklink 命令开启。如果能够通过代码实现,那么我们能够做更多有趣的事情。

本文提供使用 .NET/C# 代码创建 NTFS 文件系统的硬连接功能(目录联接)。


本文内容

    • 目录联接
    • 使用 .NET/C# 实现
    • 使用 JunctionPoint

目录联接

以管理员权限启动 CMD(命令提示符),输入 mklink 命令可以得知 mklink 的用法。

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 仓库打开此代码:

  • walterlv.demo/JunctionPoint.cs at master · walterlv/walterlv.demo

使用 JunctionPoint

如果希望在代码中创建目录联接,则直接使用:

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/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 使用 Direct3D11 的 OpenSharedResource 方法渲染来自其他进程/设备的共享资源(SharedHandle)
  • 将 Direct3D11 在 GPU 中的纹理(Texture2D)导出到内存(Map)或导出成图片文件
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • C#/.NET 当我们在写事件 += 和 -= 的时候,方法是如何转换成事件处理器的
  • 清理 git 仓库太繁琐?试试 bfg!删除敏感信息删除大文件一句命令搞定(比官方文档还详细的使用说明)
  • 可集成到文件管理器,一句 PowerShell 脚本发布某个版本的所有 NuGet 包
  • Windows 系统的默认字体是什么?应用的默认字体是什么?
  • C# 8.0 的可空引用类型,不止是加个问号哦!你还有很多种不同的可空玩法
  • 一个简单的方法:截取子类名称中不包含基类后缀的部分
  • 使用 MSBuild Target 复制文件的时候如何保持文件夹结构不变
  • 如何在 MSBuild 中正确使用 % 来引用每一个项(Item)中的元数据
  • 如何将一个 .NET 对象序列化为 HTTP GET 的请求字符串
  • 屏幕边缘上有趣的 1 个像素,看不见、摸不到
  • 在 MSBuild 编译过程中操作文件和文件夹(检查存在/创建文件夹/读写文件/移动文件/复制文件/删除文件夹)
  • 在 WPF 程序中应用 Windows 10 真•亚克力效果
  • Debian下无root权限使用Python访问Oracle
  • docker-consul
  • flask接收请求并推入栈
  • Java 最常见的 200+ 面试题:面试必备
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • React-生命周期杂记
  • storm drpc实例
  • Web设计流程优化:网页效果图设计新思路
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • (20050108)又读《平凡的世界》
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (floyd+补集) poj 3275
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (搬运以学习)flask 上下文的实现
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)甲方乙方——赵民谈找工作
  • (转载)从 Java 代码到 Java 堆
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • **CI中自动类加载的用法总结
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net 高效开发之不可错过的实用工具
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET开发人员必知的八个网站
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [AIGC] 如何建立和优化你的工作流?
  • [CTF]2022美团CTF WEB WP
  • [Django 0-1] Core.Handlers 模块
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle
  • [IE技巧] IE 中打开Office文件的设置
  • [jobdu]不用加减乘除做加法