dotnet 6 使用 CreateSymbolicLink 建立資料夾符號連結

lindexi發表於2021-11-09

本文告訴大家如何使用 dotnet 6 提供的 Directory.CreateSymbolicLink 和 File.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 的方法和使用 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

參考

參考文件:

更多文件

更多連結相關請看:

相關文章