本文告訴大家如何使用 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)
更多文件
更多連結相關請看: