You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.2 KiB
Lua
110 lines
3.2 KiB
Lua
--- Helper module for everything filesystem related.
|
|
-- @module lqc.helpers.fs
|
|
-- @alias lib
|
|
local lfs = require 'lfs'
|
|
local Vector = require 'lqc.helpers.vector'
|
|
|
|
local lib = {}
|
|
|
|
--- Concatenates multiple strings together into 1 big string
|
|
-- @param strings array of strings to be concatenated together
|
|
-- @return the concatenated string
|
|
local function strcat(...)
|
|
return table.concat({...})
|
|
end
|
|
|
|
--- Checks if 'f' is a file?
|
|
-- @param f string of a file path
|
|
-- @return true if f is a file; otherwise false
|
|
function lib.is_file(f)
|
|
return lfs.attributes(f, 'mode') == 'file'
|
|
end
|
|
|
|
--- Check if 'd' is a directory?
|
|
-- @param d string of a directory path
|
|
-- @return true if d is a directory; otherwise false
|
|
function lib.is_dir(d)
|
|
return lfs.attributes(d, 'mode') == 'directory'
|
|
end
|
|
|
|
--- Is the file a Lua file? (=a file ending in .lua)
|
|
-- @param file path to a file
|
|
-- @return true if it is a Lua file; otherwise false.
|
|
function lib.is_lua_file(file)
|
|
return file:match('%.lua$') ~= nil
|
|
end
|
|
|
|
--- Is the file a Moonscript file? (= a file ending in .moon)
|
|
-- @param file path to a file
|
|
-- @return true if it is a Moonscript file; otherwise false.
|
|
function lib.is_moonscript_file(file)
|
|
return file:match('%.moon$') ~= nil
|
|
end
|
|
|
|
--- Removes a file from the filesystem.
|
|
-- @param path Path to the file that should be removed
|
|
function lib.remove_file(path)
|
|
os.remove(path)
|
|
end
|
|
|
|
--- Checks if a file exists.
|
|
-- @param path path to a file
|
|
-- @return true if the file does exist; otherwise false
|
|
function lib.file_exists(path)
|
|
return lfs.attributes(path) ~= nil
|
|
end
|
|
|
|
--- Reads the entire contents from a (binary) file and returns it.
|
|
-- @param path path to the file to read from
|
|
-- @return the contents of the file as a string or nil on error
|
|
function lib.read_file(path)
|
|
local file = io.open(path, 'rb')
|
|
if not file then
|
|
return nil
|
|
end
|
|
local contents = file:read '*a'
|
|
file:close()
|
|
return contents
|
|
end
|
|
|
|
--- Writes the 'new_contents' to the (binary) file specified by 'path'
|
|
-- @param path path to file the contents should be written to
|
|
-- @param new_contents the contents that will be written
|
|
-- @return nil; raises an error if file could not be opened.
|
|
function lib.write_file(path, new_contents)
|
|
if not new_contents then
|
|
return
|
|
end
|
|
local file = io.open(path, 'wb')
|
|
if not file then
|
|
error('Could not write to ' .. path .. '!')
|
|
end
|
|
file:write(new_contents)
|
|
file:close()
|
|
end
|
|
|
|
--- Finds all files in a directory.
|
|
-- @param directory_path String of a directory path
|
|
-- @return a table containing all files in this directory and it's
|
|
-- subdirectories. Raises an error if dir is not a valid
|
|
-- string to a directory path.
|
|
function lib.find_files(directory_path)
|
|
local result = Vector.new()
|
|
|
|
for file_name in lfs.dir(directory_path) do
|
|
if file_name ~= '.' and file_name ~= '..' then
|
|
local file = strcat(directory_path, '/', file_name)
|
|
if lib.is_dir(file) then
|
|
result:append(Vector.new(lib.find_files(file)))
|
|
elseif lib.is_file(file) then
|
|
result:push_back(file)
|
|
end
|
|
end
|
|
end
|
|
|
|
return result:to_table()
|
|
end
|
|
|
|
return lib
|
|
|