March 18th, 2019: 3.0.2 released!

PhysicsFS is a library to provide abstract access to various archives. It is intended for use in video games, and the design was somewhat inspired by Quake 3's file subsystem. The programmer defines a "write directory" on the physical filesystem. No file writing done through the PhysicsFS API can leave that write directory, for security. For example, an embedded scripting language cannot write outside of this path if it uses PhysFS for all of its I/O, which means that untrusted scripts can run more safely. Symbolic links can be disabled as well, for added safety. For file reading, the programmer lists directories and archives that form a "search path". Once the search path is defined, it becomes a single, transparent hierarchical filesystem. This makes for easy access to ZIP files in the same way as you access a file directly on the disk, and it makes it easy to ship a new archive that will override a previous archive on a per-file basis. Finally, PhysicsFS gives you platform-abstracted means to determine if CD-ROMs are available, the user's home directory, where in the real filesystem your program is running, etc.

To explain better, you have two zipfiles, one has these files:

...the other's got these: ...and, finally, in your game's real directory: When you create the search path in PhysicsFS with those three components, and ask for what's in the "music" directory, you are told: the maps directory: the graphics directory: ...and, finally, in the root (toplevel) directory: The programmer does not know and does not care where each of these files came from, and what sort of archive (if any) is storing them. But if they need to know, they can find out through the PhysicsFS API. Furthermore, they can take comfort in knowing that those untrusted scripts we mentioned earlier can't access any other files than these. The file entries "." and ".." are explicitly forbidden in PhysicsFS.

PhysicsFS is written in portable C, runs on dozens of platforms, and is easy to add to your project by just adding a handful of C files and one header directly to your build process.

What works:

What doesn't work:





Page maintained by Ryan C. Gordon.