Accessing ROM files with RomFS
This guide of mine is old - Like 3 years old at the time of posting. I prefer to keep it up, but I don't think it very highly - It should still work though. I might make a new one in the future. I'm doing some alterations at least to make it more readable. It doesn't teach why things are done very well is my primary issue with it.
RomFS allows us to access files stored on the ROM file, cartridge, or application.
It can be used to read things such as graphics assets, audio data, and other data.
RomFS folder
You may have noticed while building that there is a folder named 'romfs' in your project:
- Project
- build
- **romfs**
- source
- Makefile
- Project.3dsx
(If it is not already present, create it now.)
This is where all the program files are stored. These files are mounted on 'romfs:/' when the app is running.
If you have any sprites, they will appear in the 'gfx' directory inside of 'romfs:/', and are accessed accordingly.
Create a text file inside of 'romfs', name it something like 'sample.txt' (or 'sample' if you have file extensions off):
- Project
- build
- **romfs**
- sample.txt
- source
- Makefile
- Project.3dsx
This file will appear as 'romfs:/sample.txt' in the program.
Using RomFS
We will initialize RomFS, check if a file exists, and then deinitialize.
Initializing
Initializing RomFS is trivial - It only takes one simple function to do it:
// Initialize the console
// ...
// Initialize RomFS
romfsInit();
// Main loop
// ...
Using
To access a file, we do basically the exact same thing we could do on a home computer in C or C++, just with a different drive.
We will check if the file exists, first by trying to open it, and checking if it failed to open. This is what you would normally do in C:
// Check if the file exists
FILE* file = fopen("romfs:/sample.txt", "r");
if (file == NULL) {
// File does not exist
puts("File does not exist.");
} else {
// File exists
puts("File exists.");
}
// Close the file
fclose(file);
// Main loop
You can play with this by adding or removing sample.txt from the 'romfs' folder.
De-initializing
Like initializing RomFS, it only takes another simple function to de-initialize:
// Main loop
// ...
// De-initialize RomFS
romfsExit();
// Return...
And that is all you need to access files on the ROM.
Wrapping up
Our code should now look like this:
#include <stdio.h>
#include <3ds.h>
int main() {
// Initialize the console
gfxInitDefault();
consoleInit(GFX_BOTTOM, NULL);
// Initialize RomFS
romfsInit();
// Check if the file exists
FILE* file = fopen("romfs:/sample.txt", "r");
if (file == NULL) {
// File does not exist
puts("File does not exist.");
} else {
// File exists
puts("File exists.");
}
// Close the file
fclose(file);
// Main loop
while(aptMainLoop()) {
// Scan for input
hidScanInput();
u32 kDown = hidKeysDown();
// Close the program if START is pressed
if (kDown & KEY_START) break;
}
// De-initialize RomFS
romfsExit();
return 0;
}