Thread overview
simple VFS implementation
Mar 30, 2016
ketmar
Mar 30, 2016
ketmar
Mar 30, 2016
ketmar
Apr 27, 2016
ketmar
Dec 12, 2016
ketmar
March 30, 2016
here[1] you can get a simple VFS system (yep, another one!). it introduces `VFile` struct (kinda like `std.stdio.File`, but with less features), which can wrap your own custom streams, `std.stdio.File`, libc `FILE*`, integer file descriptor... actually, anything you'll do a simple wrapper for. it's designed in the spirit of `fopencookie()`.

also it includes VFS features like "pak file registration", and built-in ZIP reader.

ZIP reader doesn't use `std.zip`, and doesn't unpack the whole file in memory. it is even possible to register ZIP inside ZIP as "pak" file! ;-)

also, it has functions to read and write numbers of various sizes in both endiannesses.

VFile i/o is thread-safe (but not VFile itself!)

works with DMD 2.070+

GNU GPL. i wanted you to read the whole text to find this, yeah.


1. http://repo.or.cz/iv.d.git/tree/HEAD:/vfs
March 30, 2016
oops. almost forgot to mention that it works only with POSIX systems now. windoze port *may* be done in the future (it's not that hard — basically, replace fopen/fseek/etc. imports and calls). sure, you can DIY and send me a patch too.
March 30, 2016
p.s. it's only for opening files with known names and doing file i/o. it doesn't support other FS operations (like getting list of files, or file renaming), as i wrote it for using in my game engines, and i don't need such operations there. so i won't add that, it's out of scope of the library.
April 27, 2016
iv.vfs gained ability to list files in all registered VFSes, and it now can open disk files regardless of name case on POSIX systems (this is controlled by global flags, or additional letters «i» and «I» in file mode arg).
December 12, 2016
contrary to what i said ealier, there is now a way to get list of known files, with their times and packed size (if containter supports that feature).

zip reader now understands all standard zip methods (including "shrink", "reduce" and "implode"), and LZMA (no external lzma library required). currently there are no plans to support BZip2 and PPMd compression.

internal structures creates less pressure on GC and way less false positives: instead of registering the whole allocated memory "just in case", getPointerBitmap is used to register only pointers. and many internal structs doesn't have GC pointers at all.

added iv.vfs.io module, so it is possible to use good old `write*`, `readf`, `readln` API on VFile. it also wraps standard input and output, so to do console i/o you now can import iv.vfs.io instead of std.stdio. there is also `byLine` and `byLineCopy` API. not a speed demon, tho, so i'd not try to process terrabytes of text data with it.

added zip creation module.

not really new, but worth mentioning anyway: there is nice API to read/write endianness-neutral numeric values. readNum!T and writeNum!T. and `rawReadExact()` low-level API, to read the whole buffer or throw.

added Ken Silverman's GRP support. i had to mention it somewhere.