Dot-Net

在 .NET 中實現虛擬文件系統

  • May 28, 2021

不久前,a 發現了一個漂亮的框架,它允許 .net 開發人員實現虛擬文件系統。我以為我已經為它添加了書籤,但似乎我沒有。

有誰知道這樣做的任何框架?

**編輯:**這裡有一個提示……它有一個吸引人的短名稱和它自己的域。抱歉,我只記得這些了:p

剛剛找到(開心!)

多坎

在這裡,我將嘗試總結我在 .NET 中為 Windows、Mac 和 iOS 建構虛擬文件系統的知識。本小結主要針對遠端儲存速度較慢的文件系統,如雲儲存。

首先,讓我指出,應用程序和作業系統都會對本地文件系統進行大量讀取和寫入,並期望得到非常快的響應。因此,幾乎不可能將每個文件系統呼叫映射到遠端儲存呼叫。即使使用非常高速的連接(或本地儲存),您的虛擬文件系統也可能會變得非常緩慢且無法使用這種設計。我猜想,最近的作業系統更新(2018-2021 年)中提供的新作業系統 API,以及在其之上創建的 OneDrive 等最終使用者工具,都是以這些考慮為指導的。

用於創建虛擬文件系統的新 OS API 主要依賴於同步,而不是每個操作映射,為實現按需文件夾列表、按需文件下載、刪除和移動操作提供額外的鉤子。

視窗

雲提供商 API

Windows Cloud Provider API(也稱為 Cloud Files、Cloud Filter API 和 Cloud Sync Engine)在新的 Windows 驅動程序之上執行,該驅動程序作為 Windows 10 更新的一部分安裝,於 2018 年發布(Windows Creator 更新)。

此 API 為按需文件夾列表提供回調(因此您只能載入客戶端應用程序請求的伺服器文件系統的一小部分)、按需文件內容下載以及刪除和移動/重命名操作的回調。它還提供確定文件狀態的功能,您將使用這些功能來檢測文件在客戶端已被修改並需要發送到伺服器。另一個有用的功能是它提供與 Windows 文件管理器的集成,顯示文件狀態欄、文件傳輸進度,並將文件下載事件發佈到 Windows 操作中心面板。該 API 不需要管理員權限,並允許在普通使用者下進行所有操作,包括初始文件系統掛載。

幸運的是,Windows Cloud Provider API 提供了文件打開和關閉事件,這對於某些應用程序可能至關重要,例如文件鎖定/解鎖或簽出/簽入。與 Mac OS 不同,其中打開/關閉事件僅限於某些應用程序類型,請參閱下面的 Mac 部分。

GitHub 上的 C++

範例 GitHub 上的 C# 範例。

投影文件系統 API

投影文件系統 (ProjFS)旨在將(投影)分層數據表示為文件系統。它旨在從高速儲存(例如系統資料庫)發布數據。

它的主要特點是,與 Cloud Provider API 不同,它隱藏了您的儲存是遠端的這一事實。它不提供文件狀態、進度或任何會告訴使用者這不是本地文件系統的任何指示。

GitHub 上的 C# 範例

核心模式文件系統驅動程序和過濾器

這是一種已經存在多年的傳統方法。它適用於所有 Windows 版本,甚至是 20 年前發布的版本。建構一個穩定的驅動需要大量特殊的核心模式開發和調試經驗,對抗系統崩潰,以及較長的開發週期。作為回報,它使您可以 100% 地訪問低級別的所有文件系統功能。核心模式驅動程序最合適的用途可能是為本地硬體創建虛擬文件系統。

我擔心在未來的 Windows 版本中創建文件系統驅動程序/過濾器可能會受到限制。請參閱下面的 Apple 在 Mac 上使用 Kext 驅動程序所做的事情。

Shell 命名空間擴展

Windows Shell 命名空間擴展允許您自定義 Windows 文件管理器。特別是,您可以建構將在 Windows 文件管理器中顯示並在視覺上看起來和行為類似於文件系統的節點。您還可以使用 Shell Extensions 擴展Windows 文件管理器上下文菜單。Shell Extension 不是真正的文件系統,應用程序將無法將數據讀/寫到您的文件中(除非您在 shell 擴展下放置了一個真實的或一些虛擬的文件系統)。在許多情況下,您將在虛擬文件系統之上創建一個 Shell 擴展來擴展其功能並添加上下文菜單。

蘋果系統

適用於 Mac 和系統擴展的文件提供程序 API。

自 macOS 11 Big Sur 以來,Apple 提供了用於與雲儲存同步的新 API - File Provider API。其主要功能類似於Windows上的Cloud Provider API:按需列出文件夾、按需載入文件內容、文件狀態(在雲端/正在下載/在本地文件系統中、同步中/已修改)、Mac OS查找器集成。使用此 API 的應用程序不需要管理員權限即可安裝和使用,可以按使用者和機器模式安裝,也可以在 Apple App Store 中發布。

看起來這個 API 的主要問題是它不提供文件打開和文件關閉事件。如果沒有這些事件,可能很難或不可能創建某些功能,例如,在打開/關閉時自動鎖定/解鎖或簽出/簽入文件。出於某種原因,Mac 為Endpoint Security系統擴展提供了打開/關閉事件,這需要特殊權利(例如防病毒掃描程序)。

GitHub 上 Xamarin/C# 中的範例

Kext 文件系統驅動程序(已棄用)。

自 macOS 11 起,Apple 僅允許在恢復模式下在 ARM 機器上安裝 Kext 驅動程序。App Store 中也不允許使用它們。Kexts 被 Dexts 和系統擴展取代。

iOS

iOS 的文件提供程序 API

iOS 11+ 提供了類似於 Mac 上的 File Provider API 的 File Provider API Apple 正在嘗試統一 API 並讓程序在 Mac 和 iOS 上執行,而只需進行最少的更改。iOS 和 macOS API 仍然存在一些差異,限制了為兩個作業系統創建單個文件提供程序。

.NET/C# 中 GitHub 上的範例

引用自:https://stackoverflow.com/questions/1023238