續上篇 .NET 的 Virtual File System - Lexical.FileSystem,經過上篇,應該稍微對於 VFS 的使用情境及架構多多少少有點概念了,我又發現另外一套 VFS Zio,操作起來極為順手,我想應該是他的命名相當的清楚,幾乎不用看文件就猜得出來
開發環境
- Windows 10
- Rider 2021.3.3
- .NET 5
- Zio 0.11.0
先安裝套件
Install-Package Zio -Version 0.11.0
簡介
doc:zio/doc at master · xoofx/zio (github.com)
實作
官方文件:zio/doc at master · xoofx/zio (github.com)
UPath
Zio 是透過 UPath 來處理真實和虛擬的檔案,接下來的操作都會使用到它。
當使用 Path.Combine 合併 C:\This\Path and ../Test 會得到 C:\This\Path\../Test,但是它真實路徑其實應該是 C:\This\Path\Test,UPath 會得到一致性的路徑描述,在除錯的時候清楚多了
- 可以是絕對路徑以斜線 / 開頭,或是相對路徑 ../../path
- 像是 Unix 檔案或是資料夾路徑
- / 代表分隔目錄
- 目前目錄 . 和上層目錄 .. 將會被移除(壓扁)
- \ 會被取代成 /
- 結尾有 / 會被移除
- 符合規則的UPath 就不會處理
UPath.Combine 的用法跟 Path.Combine 一樣,合併後的規則,跟上述的一樣
[TestMethod]
public void UPathCombine()
{
var rootPath = "/mnt/c/Temp/Test";
var uPath1 = UPath.Combine(rootPath, "../1");
var uPath2 = UPath.Combine(rootPath, "./2/");
var uPath3 = UPath.Combine(rootPath, "..");
var uPath4 = UPath.Combine(rootPath, @"..\..\3\");
var uPath5 = (UPath) "/this/is/a/path/to/a/directory";
var uPath6 = (UPath) @"/this\is/wow/../an/absolute/./pat/h/";
Console.WriteLine(uPath1);
Console.WriteLine(uPath2);
Console.WriteLine(uPath3);
Console.WriteLine(uPath4);
Console.WriteLine(uPath5);
Console.WriteLine(uPath6);
}
執行結果
/mnt/c/Temp/1
/mnt/c/Temp/Test/2
/mnt/c/Temp
/mnt/c/3
/this/is/a/path/to/a/directory
/this/is/an/absolute/pat/h
雖然 Path.Combime 沒有辦法得到真實合併後的路徑,仍然可以通過 DirectoryInfo.FullName 取得真實的路徑
[TestMethod]
public void PathCombine()
{
var rootPath = @"E:\src\sample.dotblog\File";
var path1 = Path.Combine(rootPath, "../1");
var path2 = Path.Combine(rootPath, "./2/");
var path3 = Path.Combine(rootPath, "..");
var path4 = Path.Combine(rootPath, @"..\..\3\");
Console.WriteLine(new DirectoryInfo(path1).FullName);
Console.WriteLine(new DirectoryInfo(path2).FullName);
Console.WriteLine(new DirectoryInfo(path3).FullName);
Console.WriteLine(new DirectoryInfo(path4).FullName);
}
執行結果
E:\src\sample.dotblog\1
E:\src\sample.dotblog\File\2\
E:\src\sample.dotblog
E:\src\3\
IFileSystem
ZIO 跟上篇介紹的 Lexical.FileSystem 一樣,也有定義抽象 IFileSystem,內部的細節使用的是 System.IO,他提供的 API 跟原生的很像,使用起來沒太大問題,入門也算是快的,下圖出自 zio/doc at master · xoofx/zio (github.com)
API
很好,可以直接改檔案名稱
路徑轉換
IFileSystem.ConvertPathFromInternal:把實體路徑的路徑轉成 UPath, c:\Temp\Test => /mnt/c/Temp/Test
IFileSystem.ConvertPathToInternal:把 UPath 轉成實體路徑 /mnt/c/Temp/Test => c:\Temp\Test
PhysicalFileSystem
傳入UPath,/mnt 代表是磁碟區,比如
- /mnt/c/ = C:\
- /mnt/c/Temp/Test = c:\Temp\Test
var fs = new MemoryFileSystem();
fs.DirectoryCreate("/mnt/c/Temp/Test");
MemoryFileSystem
- MemoryFileSystem 和 PhysicalFileSystem 都實作相同的抽象。
- 操作結構 (目錄、資料夾) 的行為都一樣,路徑規則也一樣。
- MemoryFileSystem 結構存放在記憶體,可完美的複製真實的結構路徑,看起來更真實,卻又不影響真實世界。
另外, MemoryFileSystem.Clone 靜態方法,讓我們更簡單的複製新的結構到記憶體。
結論
Zio 是我目前遇到最好上手的 VFS,不過 Zio 沒有像 Lexical.FileSystem 提供列印整個結構,但,整體來說我比較喜歡 Zio
範例
https://github.com/yaochangyu/sample.dotblog/tree/master/File/Lab.VSF/Lab.ZIO.TestProject
相關文章
.NET 的 Virtual File System - Lexical.FileSystem
.NET 的 Virtual File System - Zio FileSystem
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET