本文告诉大家如何使用 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. 错误

代码

以上所有代码放在 github 和 gitee 欢迎访问

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

先创建一个空文件夹,接着使用命令行 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. 重启ubuntu系统VMware tools失效处理方法

    1) sudo apt-get autoremove open-vm-tools 2) Install VMware Tools by following the usual method (Virt ...

  2. Java学习之随堂笔记系列——day04

    今日内容1.break和continue关键字以及循环嵌套    1.1 break和continue的区别?        continue表示跳过当前循环,继续执行下一次循环break表示结束整个 ...

  3. python全局变量的定义

    第一:如定义在类或者函数体外,在函数或者类中引用需要用到 global声明 temp_t = "ceshi" def tmp1(): global temp_t temp_t =1 ...

  4. mapper-spring-boot-starter 主要作用是

    今天是第一次接触到 这个场景启动器内心中真是一片的茫然,学习了这么长时间我居然还不知道有这个的存在今天好好查一查资料 参考资料(https://blog.csdn.net/crq1205/articl ...

  5. windows2012添加ssl证书

    第一步: 先下载   rewrite_x64_zh-cn.msi   ,并安装 (*这个是2.0版本,千万不要安装2.1版本,否则导致网站进程池全部关闭) https://www.microsoft. ...

  6. 2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)

    前言 依旧是白嫖账号,只打了一些题/kk 正题 1002 Buying Snacks 题目大意 \(n\)个物品,每个可以买一次也可以不买,如果买需要选择\(1/2\)块钱的,然后也可以相邻两个一起买 ...

  7. P4424-[HNOI/AHOI2018]寻宝游戏【结论】

    正题 题目链接:https://www.luogu.com.cn/problem/P4424 题目大意 \(n\)个\(m\)位二进制数,开始是一个\(0\). 然后依次对所有二进制数进行\(n\)次 ...

  8. Ubuntu安装Oracleclient远程连接数据库

    平时Oracle数据库都安装在本地或者WindowsServer上进行使用,但因为工作需要,领导要求在虚拟机中安装Ubuntu来连接Windows本地安装的数据库,先将操作过程和遇到的问题进行梳理总结 ...

  9. 启用 Spring-Cloud-OpenFeign 配置可刷新,项目无法启动,我 TM 人傻了(上)

    本篇文章涉及底层设计以及原理,以及问题定位,比较深入,篇幅较长,所以拆分成上下两篇: 上:问题简单描述以及 Spring Cloud RefreshScope 的原理 下:当前 spring-clou ...

  10. C++学习笔记:09 函数模板与类模板

    课程<C++语言程序设计进阶>清华大学 郑莉老师) 引入 考虑一个求绝对值函数myabs,对于int,double,float等数据类型需要重载多次,编写多个函数体.函数体逻辑代码完全一致 ...