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 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

參考

參考文檔:

更多文檔

更多鏈接相關請看:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM