本文告诉大家如何使用 dotnet 6 提供的 Directory.CreateSymbolicLink 和 File.CreateSymbolicLink 方法创建文件夹和文件的符号链接

Directory.CreateSymbolicLink

例子

使用方法十分简单,如下面例子,给 aa 文件夹创建一个叫 bb 文件夹的符号链接

        public static void Main(string[] args)
{
var a = Directory.CreateDirectory("aa"); Directory.CreateSymbolicLink("bbb", a.FullName);
}

效果

执行上述代码的效果如下

Rx-Explorer 里的效果如下

更多细节

这个 CreateSymbolicLink 方法是有返回值的,创建成功文件夹链接,将会返回文件夹对应的 DirectoryInfo 值

            var result = Directory.CreateSymbolicLink("bbb", a.FullName) as DirectoryInfo;

            // 输出 bbb 文件夹
Console.WriteLine(result.FullName);

行为特例

  • 如果传入的 pathToTarget 参数,也就是上面代码的 a.FullName 参数,如果是文件,那么以上函数将继续成功执行,创建出一个不可用的文件夹链接

  • 在当 path 参数,也就是上面代码的 "bbb" 参数,存在文件夹的时候,将会失败,抛出 System.IO.IOException: Cannot create 'bbb' because a file or directory with the same name already exists. 错误

代码

以上所有代码放在 githubgitee 欢迎访问

可以通过如下方式获取本文代码

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 0d632e7c1b7e9245744c9816d2c91b3ba94e1838

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 BemfejulereLarcayjika 文件夹

File.CreateSymbolicLink

例子

使用 File.CreateSymbolicLink 的方法和使用 Directory.CreateSymbolicLink 的差不多,不同的在于类型不相同和传入的参数要求是文件而已,如下面代码

            File.WriteAllText("a.txt", "123");

            var result = File.CreateSymbolicLink("b.txt", "a.txt") as FileInfo;

            // 输出 b 文件
Console.WriteLine(result.FullName); Console.WriteLine(File.ReadAllText("b.txt"));

可以看到符号链接的文件对于上层应用来说和其他文件是相同的用法,如上面代码,读取 b.txt 文件就和读取 a.txt 一样

效果

执行上面的代码可以看到如下的效果

尝试双击 b.txt 用记事本打开,记事本里面看到的是 a.txt 的内容,编辑也是对 a.txt 生效,如何 Windows API 的定义

行为特例

假定使用 File.CreateSymbolicLink 方法,传入的作为符号链接的是文件夹,那么将会抛出 System.UnauthorizedAccessException 异常,当前是 2021.11.06 使用 .NET 6-rc2 也许后续版本会更改行为

如果传入的文件是不存在的,也就是上面代码的 a.txt 假定是不存在的,将会抛出 System.IO.FileNotFoundException 错误

代码

在上面的代码仓库基础上,切换到 a423c63cb7bbd2a92a7e2daf59a8eb336b5e22c2 的 commit 即可拿到代码,可以使用如下命令进行切换

git pull origin a423c63cb7bbd2a92a7e2daf59a8eb336b5e22c2

参考

参考文档:

更多文档

更多链接相关请看:

dotnet 6 使用 CreateSymbolicLink 创建文件夹符号链接的更多相关文章

  1. PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)

    在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其实不是那样,单个的MKDIR只能创建一级目录,对于多级的就不行了,那如何用mkdir来创建呢?先我抄一段 ...

  2. github创建文件夹

      网页上只能通过在创建新文件的时候顺便创建文件夹(文件夹与文件用 / 隔开),例如home/test.md就在该仓库下创建了一个文件夹home,该文件夹下有一个新的文件test.md

  3. windows环境下创建 .文件夹

    一.windows环境下创建 .文件夹 1.新建一个文件夹 2.重命名为.properties.(名字前后都加点) 二.windows环境下创建 .文件 1.上面的方法对文件同样适用 2.运行CMD, ...

  4. Java 判断文件夹、文件是否存在、否则创建文件夹

    1.判断文件是否存在,不存在创建文件 File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm"); if( ...

  5. C#创建文件夹

    string path = Server.MapPath("~/DefaultImg/newDir/63/");//获取文件路径 if (!Directory.Exists(pat ...

  6. 用SQL语句建库建表建约束(用SQl语句在指定盘符创建文件夹)

    一 :创建数据库 创建一个数据文件和一个日志文件(MySchool) create database MySchoolon primary      --默认属于primary主文件组,可省略(--数 ...

  7. mkdir:批量创建文件夹

    问题:mkdir dir[0-9]创建文件夹时,并没有如预期创建dir0~dir9这几个文件夹,而是创建了dir[0-9]这一个文件夹. 网上看了些相关资料,发现以前对[0-9]的理解不够透彻: &q ...

  8. 如何异步创建文件夹(node)

    模块fs作为node的核心模块之一,支持本地文件操作的接口,几乎对于所有的操作都提供同步和异步两种方案.例如,创建文件夹有mkdir和mkdirSync.不论对于mkdir还是mkdirSync,都需 ...

  9. php中如何创建文件夹

    这个功能比较简单,直接上代码了: $dir = iconv("UTF-8", "GBK", "Public/bookcover"); if ...

随机推荐

  1. P7323-[WC2021]括号路径【并查集,启发式合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P7323 题目大意 给出\(n\)个点的一张有向图.每个边\((u,v,w)\)表示\(u->v\)有一个类型 ...

  2. CF848E-Days of Floral Colours【dp,分治NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/CF848E 题目大意 \(2n\)个花排成一个圆环,\(n\)种颜色每种两个,要求两个相同颜色之间最小距离为\(1, ...

  3. python OSError: [Errno 22] Invalid argument: '\u202aF://text

    windows10 python3 读文件的时候报的错误 原因不明时好时坏很头疼但又没办法不知道怎么解决,网上的说法都不能解决,

  4. 1. JVM核心类加载器及类加载的全过程

    运行环境: 下面说明一下我的运行环境.我是在mac上操作的. 先找到mac的java地址. 从~/.bash_profile中可以看到 java的home目录是: /Library/Java/Java ...

  5. 踩坑系列《十一》完美解决阿里云vod视频点播无法播放音频和视频点播控制台里的媒资库里面的视频无法播放

    刚开始项目部署的时候,音频还是正常播放,后面直接报了 获取m3u8文件失败(manifestLoadError) 的错误,原因是 我的域名 xxx.com 这个域名没有解析到点播提供的CNAME上,所 ...

  6. Linux基础安全配置(centos7)

    1.帐户口令的生存期不长于90天 sed -i.old 's#99999#90#g' /etc/login.defs egrep "90" /etc/login.defs 2.密码 ...

  7. 好奇!仅 13kB 大小的游戏,源码长啥样?

    这个马赛克风格的表情正好 13Kb,有人竟然能用一个表情大小的空间,制作个游戏出来.我就不信这么点的地儿,能写出个花来?游戏能好玩吗?因为这些游戏点开就能玩,我抱着试一试的心态把玩了一会. 事实证明是 ...

  8. (翻译)领域驱动设计实现-Implementing Domain Driven Design

    简介 Implementing Domain Driven Design 领域驱动设计实现 A practical guide for implementing the Domain Driven D ...

  9. javascript-原生-面向对象

    1.javascript面向对象程序设计 概述:javascript不想其他面向对象编程语言那样有类的概念,javascript没有类(构造函数)的概念,只有对象的概念. 2.理解javascript ...

  10. 想要彻底搞懂大厂是如何实现Redis高可用的?看这篇文章就够了!(1.2W字,建议收藏)

    高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 假设系统一直能够提供服务,我们说系统的可用性是100%.如果 ...