[Feature Request] Partially virtual/mockable filesystem
Is your feature request related to a problem? Please describe. In my project, there's a few places where I need to temporarily store a directory's worth of data as files, but this is rather cumbersome. Reading/writing to the filesystem is painfully slow, this is easily the slowest part of these paths.
I investigated using MockFileSystem for this, but it appears that MockFileSystem mocks out everything. So there's no way to have some of the filesystem be mocked and some not be mocked.
Describe the solution you'd like I'd like the ability to mock out a portion of the filesystem via System.IO.Abstractions, maybe via a virtual drive? This would let me use the exact same logic I already have for handling filesystems, except against a virtualized filesystem that would be vastly more performant.
Describe alternatives you've considered I'm able to write these classes myself and plan to do so, but ideally this feature would be provided within System.IO.Abstractions. My proposed name is "ComplexFileSystem", since it has "real" and "imaginary" components 😊.
I don't understand what you want to achieve. Is it that only parts of the functionality are mocked (e.g. only reading/writing files, but not directories) or that the whole functionality is mocked on a specific path/drive? What advantages do you see in a mixed mode?
My use case is primarily for latency. I have a few places where I'm writing temporary files, and going through the Windows filesystem is a bottleneck. My assumption was that a virtual filesystem would be faster, though I haven't actually benchmarked this to be certain, I should definitely do that asap. 😅
There are also some cases where programmatically mocking out files would be convenient. The main example I can think of is for extracting compressed archives.
Assuming that this is indeed faster:
This could be done in my own project by having a filesystem and mockfilesystem and carefully picking which one is used via dependency injection, but this would introduce a lot of complexity downstream.
Ideally the real/fake filesystems could be used interchangeably in a single filesystem implementation that encapsulates switching between them.
To disambiguate between real/fake files, I think the best thing would be to this set up the fake filesystem as an unquestionably fake drive. I forked the original version of MockFileSystem and used '_' as the fake drive letter, which is invalid for Windows.
Anyway, this is something I've already set up, so it's not an urgent ask from me. It just seemed like another nice thing this library could offer.
So you want to use the mock file system in your production code as some sort of caching mechanism? If I understand this correctly, I would recommend against using it this way, as the intended use case of the mock file system is for testing!