Deficuet.ROVFS
0.0.1-alpha.15
dotnet add package Deficuet.ROVFS --version 0.0.1-alpha.15
NuGet\Install-Package Deficuet.ROVFS -Version 0.0.1-alpha.15
<PackageReference Include="Deficuet.ROVFS" Version="0.0.1-alpha.15" />
<PackageVersion Include="Deficuet.ROVFS" Version="0.0.1-alpha.15" />
<PackageReference Include="Deficuet.ROVFS" />
paket add Deficuet.ROVFS --version 0.0.1-alpha.15
#r "nuget: Deficuet.ROVFS, 0.0.1-alpha.15"
#:package Deficuet.ROVFS@0.0.1-alpha.15
#addin nuget:?package=Deficuet.ROVFS&version=0.0.1-alpha.15&prerelease
#tool nuget:?package=Deficuet.ROVFS&version=0.0.1-alpha.15&prerelease
ROVFS — Read Only Virtual File System
A read-only virtual file system framework for Windows, built on WinFsp via winfsp.net. Targets netstandard2.0, so Unity 2022+ projects can consume it directly.
ReadOnlyFileSystem implements the read half of a WinFsp file system and delegates all data access to a user-supplied data manager. All write operations (Create, Write, Rename, SetDelete) are rejected, and Open denies every write-related NT access bit.
Core types
| Type | Role |
|---|---|
ReadOnlyFileSystem<...> |
The WinFsp FileSystemBase implementation; forwards lookups, reads, enumeration, and security queries to the data manager. |
FileSystemNode |
Marker base class for file entries and directory views. |
DirectoryViewBase<TFileEntry, TDirectoryView, TEntryKey> |
A directory that only knows its children's names and node types; sizes and timestamps are resolved per entry by the data manager. |
EntryInfo<TEntryKey> |
One enumerated directory entry: the entry key plus whether it is a directory. |
SegmentedFileEntryBase |
Base for file entries with BackingFileOffset (base offset in the backing physical file) and FileSize. |
IFileSystemDataManager<TFileEntry, TDirectoryView, TFileContext, TDirectoryContext, TEntryKey> |
The contract implementers fill in: path resolution, file contexts, FileInfo assembly, security, volume info, logging. |
SegmentedFileSystemDataManagerBase |
A ready-made data manager base whose file contexts are SafeFileHandles; reads go through Win32RandomAccess. |
Win32RandomAccess |
P/Invoke helpers: CreateFileW with FILE_FLAG_OVERLAPPED for concurrent random access, and offset-based ReadFile via an OVERLAPPED. |
Win32PatternMatcher |
Win32 wildcard matching (MatchesWin32Expression / TranslateWin32Expression), ported from System.IO.Enumeration.FileSystemName, which is unavailable on netstandard2.0. |
Contracts expected from implementations
- Flat path lookup. Path resolution is by full path; the intended implementation is two flat dictionaries (files and directories) keyed by the paths WinFsp passes in. These paths are always rooted at
\and use\separators, regardless of whether the volume is mounted on a drive letter or into an existing empty folder — the mount point prefix never reaches user mode. - Directory contexts.
CreateDirectoryContextruns when a directory is opened and produces an opaqueTDirectoryContext; it is handed back for child path joining (GetChildFullPath) during enumeration and passed as-is toCloseContext. A plainstring(the directory path) is a sensible choice;GetChildFullPathmust not produce doubled backslashes for the root directory, whose path is\. - Enumeration.
GetEntryInfoEnumerableyieldsEntryInfo<TEntryKey>in a stable, sorted order, since WinFsp resumes directory enumeration by the last returned name (marker). WhenPassQueryDirectoryPatternis enabled the data manager must also apply the wildcard pattern. A name→index map makes marker lookup O(1); a natural-sort binary search handles markers that are not present verbatim. - Thread safety. WinFsp calls into the data manager from multiple worker threads concurrently (opens, reads, enumerations, metadata queries). Implementations must be safe for concurrent reads; the intended pattern is populate-once-then-mount, after which the lookup structures are never modified.
- File handles.
TryGetFileContextruns perOpen; back the handles withFILE_FLAG_OVERLAPPED(seeWin32RandomAccess.OpenFileReadOnly) so the same handle can serve concurrent offset-based reads.
WinFsp host settings applied in Init
SectorSize/SectorsPerAllocationUnit = 4096/1, MaxComponentLength = 255, FileInfoTimeout = 60000, CaseSensitiveSearch = false, CasePreservedNames/UnicodeOnDisk/PersistentAcls = true, PassQueryDirectoryPattern = true, FlushAndPurgeOnCleanup = false (no flush or cache purge makes sense on a read-only volume). Volume label, creation time, and total size come from the data manager; free size is always 0.
NuGet Dependencies
winfsp.net2.1.25156- The installed WinFsp must also be 2.1, otherwise the native dll versions do not match.
System.Memory4.6.3- Provides the span types on
netstandard2.0; consumers (e.g. Unity) must ship this dll as well.
- Provides the span types on
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.Memory (>= 4.6.3)
- winfsp.net (>= 2.1.25156)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Deficuet.ROVFS:
| Package | Downloads |
|---|---|
|
Deficuet.APFS
Read-only file system mapping asset files based on WinFsp |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.0.1-alpha.15 | 96 | 9/8/2026 |
| 0.0.1-alpha.14 | 68 | 9/8/2026 |
| 0.0.1-alpha.13 | 65 | 9/8/2026 |
| 0.0.1-alpha.12 | 82 | 9/7/2026 |
| 0.0.1-alpha.11 | 73 | 9/6/2026 |
| 0.0.1-alpha.10 | 73 | 9/5/2026 |
| 0.0.1-alpha.9 | 70 | 9/5/2026 |
| 0.0.1-alpha.8 | 62 | 9/4/2026 |
| 0.0.1-alpha.7 | 65 | 8/31/2026 |
| 0.0.1-alpha.6 | 77 | 8/31/2026 |
| 0.0.1-alpha.5 | 68 | 8/31/2026 |
| 0.0.1-alpha.4 | 77 | 8/31/2026 |
| 0.0.1-alpha.3 | 68 | 8/31/2026 |
| 0.0.1-alpha.2 | 69 | 8/30/2026 |
| 0.0.1-alpha.1 | 107 | 8/29/2026 |