ProjFS新手開發(fā)總結(jié)
ProjFS新手開發(fā)總結(jié)
官方描述: Windows Projected File System (ProjFS) 允許名為“provider”的用戶模式應(yīng)用程序?qū)浞輸?shù)據(jù)存儲中的分層數(shù)據(jù)投影到文件系統(tǒng)中,使其顯示為文件系統(tǒng)中的文件和目錄。例如,簡單的提供程序可以將Windows注冊表投影到文件系統(tǒng)中,使注冊表項(xiàng)和值分別顯示為文件和目錄。更復(fù)雜的提供程序示例是用于虛擬化非常大的git存儲庫的VFS for Git。
構(gòu)架原理

構(gòu)架&原理:通過在原生的NTFS之上抽象出一套Callback機(jī)制,實(shí)現(xiàn)用戶層面的數(shù)據(jù)一致性管理
適用范圍:僅對virtualizationRootDir作為根目錄以及其下的子目錄有效,NormalDir普通目錄不在控制范圍內(nèi)。
應(yīng)用場景&局限性:主要用于VFS層面已有文件的讀取、修改、刪除、目錄遍歷等跟蹤與控制,對于新建文件只能通過Notification來跟蹤狀態(tài)。
性能表現(xiàn):從實(shí)際測得的數(shù)據(jù)來看,在SSD磁盤中,開啟ProjFS會額外增加最少50%的性能開銷(主要是延遲增加)
運(yùn)行機(jī)制&流程

關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

六大關(guān)鍵狀態(tài)
獲取狀態(tài)PrjGetOnDiskFileState函數(shù),目前該函數(shù)存在部分目錄or文件查詢不到狀態(tài)的情況。

開發(fā)必讀
官方文檔:https://learn.microsoft.com/en-us/windows/win32/projfs/projfs-programming-guide
官方C#用例:https://github.com/microsoft/ProjFS-Managed-API/tree/main/simpleProviderManaged
官方最佳實(shí)踐C#: https://github.com/microsoft/VFSForGit
C++精簡用例:https://git-sa.nie.netease.com/gajira/projfscpp
官方C++用例:https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/ProjectedFileSystem
其他
第三方C#庫:https://github.com/dahall/Vanara/blob/master/PInvoke/ProjectedFSLib/readme.md
第三方c#庫用例:https://github.com/dahall/WinClassicSamplesCS/tree/master/ProjectedFileSystem
