The `asset://` and `user://` paths
Where to read assets, store progress and obtain a path for System.IO.
Locate a file
| Path | Meaning |
|---|---|
asset://Props/Crate.rprefab | A resource relative to the project root containing project.reckfell |
user://io-demo/world.json | Data for this application and user, retained between runs |
C:/Games/Pack/image.png | An absolute OS path chosen separately for the current device |
Use / in API paths, including on Windows. Do not store progress in asset://: shipped assets may live in a resource pack and the installation directory may be read-only. user:// is intended for writable data; it cannot guarantee free space or access under every OS configuration.
Store a slot name or user://saves/slot-1.json in save settings rather than an absolute C:/Users/... path. Absolute paths belong to one device/user; obtain the actual directory at runtime.
Find the actual directory
Attach PathDemo.cs to an ordinary Entity, build the C# project and run the level. Console (Alt + O) prints the project root, user directory and full slot path. The editor also opens saves through Project → Open User Data Folder.
using Reckfell;
public partial class PathDemo : Entity
{
public override void _Ready()
{
ReckfellApi.Print($"Project: {ProjectSettings.GlobalizePath("asset://")}");
ReckfellApi.Print($"User data: {OS.GetUserDataDir()}");
ReckfellApi.Print($"Save: {ProjectSettings.GlobalizePath("user://io-demo/world.json")}");
}
}FileAccess and DirAccess understand virtual prefixes. System.IO does not; pass it the result of ProjectSettings.GlobalizePath(). This conversion does not extract resource-pack contents to disk. Use ResourceLoader for imported assets even when you know the absolute source path.
GlobalizePath() does not create directories. Before writing user://io-demo/..., call DirAccess.MakeDirRecursiveAbsolute("user://io-demo") and check for Error.Ok. See the complete file example.
Configure the user directory
OS.GetUserDataDir() returns the actual path. The Windows default is %APPDATA%/Reckfell/app_userdata/<project name>; it depends on application/config/name.
application/config/use_custom_user_dir enables a separate application directory. application/config/custom_user_dir_name sets its name, for example Studio/Game. Changing these settings or the project name does not move old saves automatically. Keep the shipped name stable and design migration separately.
ProjectSettings.LocalizePath() converts suitable absolute paths inside the project into asset://. Do not treat it as a general inverse conversion into user://; this version has no such contract. Keep virtual slot paths from the start.
If a file is missing
Compare the actual OS.GetUserDataDir() result, project name and filename case. Windows can hide case mistakes that fail on another filesystem. FileAccess.Open() alone does not create missing parent directories. A slot may not exist on first launch; handle that read result without erasing another slot.