本文告诉大家如何使用 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.
错误
代码
可以通过如下方式获取本文代码
先创建一个空文件夹,接着使用命令行 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
参考
参考文档:
- Directory.CreateSymbolicLink(String, String) Method (System.IO)
- File.CreateSymbolicLink(String, String) Method (System.IO)
更多文档
更多链接相关请看: