.NET 的 Virtual File System - Zio FileSystem

續上篇 .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

簡介

github:xoofx/zio: A cross-platform abstract/virtual filesystem framework with many built-ins filesystems for .NET (github.com)

doc:zio/doc at master · xoofx/zio (github.com)

實作

官方文件:zio/doc at master · xoofx/zio (github.com)

專案位置:xoofx/zio: A cross-platform abstract/virtual filesystem framework with many built-ins filesystems for .NET (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~2019 .NET

Image result for microsoft+mvp+logo