dotnet 6 使用 CreateSymbolicLink 創建文件夾符號鏈接

本文告訴大家如何使用 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 //gitee.com/lindexi/lindexi_gd.git
git pull origin 0d632e7c1b7e9245744c9816d2c91b3ba94e1838

以上使用的是 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源

git remote remove origin
git remote add origin //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

參考

參考文檔:

更多文檔

更多鏈接相關請看: