Files
Halyde/halyde/lib/filesystem.lua
T
2025-04-02 19:39:36 +03:00

69 lines
1.9 KiB
Lua

local loadfile = ... -- raw loadfile from boot.lua
local component
if loadfile then
component = loadfile("/halyde/lib/component.lua")(loadfile)
else
component = require("component")
end
local filesystem = {}
function filesystem.processPath(path) -- returns the address and absolute path of a filesystem path as well as sanitizing it
checkArg(1, path, "string")
absPath = path:gsub("/+", "/"):gsub("/$", "")
local address = nil
if absPath:find("^/mnt/.../") then
address = component.get(path:sub(6,8))
if not address then
address = computer.getBootAddress()
else
absPath = absPath:sub(9)
end
else
address = computer.getBootAddress()
end
if not address then
return nil, "no such device"
end
return address, absPath
end
function filesystem.exists(path) -- check if path exists
checkArg(1, path, "string")
local address, absPath = filesystem.processPath(path)
if not address then
return false
end
return component.invoke(address, "exists", absPath)
end
function filesystem.open(path, mode) -- opens a file and returns its handle
checkArg(1, path, "string")
checkArg(2, mode, "string", "nil")
if not mode then
mode = "r"
end
if not (mode == "r" or mode == "w" or mode == "rb" or mode == "wb") then
return nil, "invalid handle type"
end
local address, absPath = filesystem.processPath(path)
local handle = component.invoke(address, "open", absPath, mode)
local properHandle = {}
properHandle.handle = handle
properHandle.address = address
function properHandle.read(self, amount)
checkArg(2, amount, "number")
return component.invoke(self.address, "read", self.handle, amount)
end
function properHandle.write(self, data)
checkArg(2, data, "string")
return component.invoke(self.address, "write", self.handle, data)
end
function properHandle.close(self)
return component.invoke(self.address, "close", self.handle)
end
return properHandle
end
return(filesystem)