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 copydestination_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 copydestination_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 totrue, 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 filestrue: Only directoriesfalse: 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.
io.open(filename, mode): Open a file for reading or writing.
Info
Use rb and wb rather than r and w for working with binary files, otherwise your code will break on Windows.
io.lines([filename]): Get an iterator over the lines of a file.io.tmpfile(): Get a handle for a temporary file.os.tmpname(): Get a name for a temporary file.os.remove(filename): Removes an entry (file or empty directory)os.rename(oldname, newname): Moves/renames an entry (file or directory)