Filesystem

Filesystem #

Luanti provides various utility functions to help with managing paths, files & directories.

Info

Mod security restricts file system access to the mod path (at load time) and the world path later on in secure environments, see Lua Environment.

Paths #

Warning

Always operate on absolute paths, never on relative ones; no assumption about the current working directory can be made.

Normalization #

Luanti normalizes paths you pass into filesystem-related functions, replacing / with the platform-specific path delimiter (usually \ on Windows, / on UNIX).

Using / in paths is thus always fine. However, paths returned by Luanti are usually not normalized.

DIR_DELIM #

Global variable which holds the path delimiter as a {type-string} (usually \ on Windows, / on UNIX).

Usually not necessary due to path normalization (perhaps only necessary when parsing paths), but may be used “for good measure” (user-friendly paths using the platform-specific delimiters).

core.get_modpath #

Gets the path of a mod, if it is loaded. If the mod isn’t loaded, it will return nil.

Arguments:

  • modname - {type-string}: The mod name

Tip

Use local modpath = core.get_modpath(core.get_current_modname()) rather than hardcoding your modname.

Returns:

  • modpath - {type-string}: The absolute, non-normalized path to the mod directory

core.get_worldpath #

No arguments.

Returns:

  • worldpath - {type-string}: The absolute, non-normalized path to the world directory

Directories #

Common Returns

  • success - {type-bool}: Whether the operation succeeded.

Tip

Use assert to error on failure.

core.mkdir #

Creates a directory and nonexistent parent directories.

Arguments:

  • path - {type-string}: Path to the directory to create

core.cpdir #

Copies a source directory to a destination.

Arguments:

  • source_path - {type-string}: Path to the source directory to copy
  • destination_path - {type-string}: Path to the destination directory

Warning

If the destination directory exists already, it will be overwritten.

core.mvdir #

Moves a source directory to a destination.

If the destination is a non-empty directory, the move will fail.

Arguments:

  • source_path - {type-string}: Path to the source directory to copy
  • destination_path - {type-string}: Path to the destination directory

core.rmdir #

Removes a directory.

Arguments:

  • path - {type-string}: Path to the directory to remove.
  • recursive - {type-bool}: Whether to recursively delete the directory’s content; if this is not set to true, removal will fail if the directory is nonempty

core.get_dir_list #

Lists direct directory contents.

Arguments:

  • path - {type-string}: Path to the directory to remove.
  • is_dir - {type-nil} or {type-bool}: Whether to list:
    • nil: Both directories and files
    • true: Only directories
    • false: Only files

Returns:

  • entry_list - list of {type-string}: List of entry names - not paths!; you should make no assumptions concerning the order of this list.

Files #

core.safe_file_write #

Performs an atomic binary file write: Either all or nothing is overwritten. This is done by creating a temporary file, writing to it, then swapping with the temporary file.

Use this function to prevent corruption of save files.

Using core.safe_file_write(path, content) would be equivalent to

local f = io.open(path, "wb")
f:write(content)
f:close()

if this code block was atomic.

Arguments:

  • path - {type-string}: Path to the file to write.
  • content - {type-string}: The content to write.

Returns:

  • success - {type-bool}: Whether the operation succeeded.

Lua builtins #

All properly overridden by Luanti to apply mod security restrictions.

Info

Use rb and wb rather than r and w for working with binary files, otherwise your code will break on Windows.