2017-07-31 12:10:07 +10:00
|
|
|
do
|
|
|
|
_G.fs = {}
|
|
|
|
local fT,hT = {},{["_c"]=0}
|
|
|
|
function fs.mount(mp,pr)
|
|
|
|
fT[mp] = pr
|
|
|
|
end
|
|
|
|
function fs.simplify(p)
|
|
|
|
local pt,npt,rp = {},{},""
|
|
|
|
for P in p:gmatch("[^/]+") do
|
|
|
|
pt[#pt+1] = P
|
|
|
|
end
|
|
|
|
for k,v in pairs(pt) do
|
|
|
|
if v == ".." then
|
|
|
|
npt[#npt] = nil
|
|
|
|
elseif v ~= "." then
|
|
|
|
npt[#npt+1] = v
|
|
|
|
end
|
|
|
|
end
|
|
|
|
for k,v in pairs(npt) do
|
|
|
|
rp=rp.."/"..v
|
|
|
|
end
|
|
|
|
if p:sub(1,1) ~= "/" then rp = rp:sub(2) end
|
|
|
|
return rp
|
|
|
|
end
|
|
|
|
function fs.resolve(p)
|
|
|
|
if p:sub(1,1) ~= "/" then -- absolute/relative path
|
|
|
|
p=(os.getenv("PWD") or "").."/"..p
|
|
|
|
end
|
|
|
|
p=fs.simplify(p)
|
2017-08-01 15:45:22 +10:00
|
|
|
local pt,spt = {},""
|
2017-07-31 12:10:07 +10:00
|
|
|
for P in p:gmatch("[^/]+") do
|
|
|
|
pt[#pt+1] = P
|
|
|
|
end
|
2017-08-01 15:45:22 +10:00
|
|
|
for i = 2, #pt do
|
2017-08-01 18:13:31 +10:00
|
|
|
spt=spt.."/"..pt[i]
|
2017-08-01 15:45:22 +10:00
|
|
|
end
|
|
|
|
return pt, pt[1], spt
|
|
|
|
end
|
|
|
|
function fs.exec(fc,m,...)
|
|
|
|
return fT[fc][m](...)
|
2017-07-31 12:10:07 +10:00
|
|
|
end
|
|
|
|
function fs.open(p,m)
|
|
|
|
local _,d,p = fs.resolve(p)
|
|
|
|
local d = fT[d]
|
2017-08-04 17:44:10 +10:00
|
|
|
if d then
|
|
|
|
local f,C=d.open(p,m),hT._c
|
|
|
|
if f then
|
|
|
|
hT._c = C + 1
|
|
|
|
hT[C] = {d,f}
|
|
|
|
return C
|
|
|
|
end
|
|
|
|
return false
|
2017-07-31 12:10:07 +10:00
|
|
|
end
|
|
|
|
end
|
|
|
|
function fs.close(h)
|
|
|
|
if hT[h] then
|
|
|
|
hT[h][1].close(hT[h][2])
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
function fs.read(h,n)
|
|
|
|
if hT[h] then
|
|
|
|
return hT[h][1].read(hT[h][2],n)
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
function fs.readall(f)
|
|
|
|
local s=""
|
2017-08-03 17:54:38 +10:00
|
|
|
while true do
|
2017-07-31 12:10:07 +10:00
|
|
|
c=fs.read(f,2048)
|
2017-08-03 17:54:38 +10:00
|
|
|
if not c then break end
|
2017-07-31 12:10:07 +10:00
|
|
|
s=s..c
|
2017-08-03 17:54:38 +10:00
|
|
|
end
|
2017-07-31 12:10:07 +10:00
|
|
|
return s
|
|
|
|
end
|
|
|
|
function fs.write(h,d)
|
|
|
|
if hT[h] then
|
|
|
|
return hT[h][1].write(hT[h][2],d)
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
2017-08-01 15:45:22 +10:00
|
|
|
function fs.list(s)
|
2017-08-01 16:29:56 +10:00
|
|
|
s=s or ""
|
2017-08-01 14:36:38 +10:00
|
|
|
local _,d,p = fs.resolve(s)
|
2017-08-01 15:45:22 +10:00
|
|
|
if not d then
|
|
|
|
local kt = {}
|
|
|
|
for k,v in pairs(fT) do
|
|
|
|
kt[#kt+1] = k
|
|
|
|
end
|
|
|
|
return kt
|
|
|
|
end
|
2017-08-01 14:36:38 +10:00
|
|
|
return fT[d].list(p or "/")
|
|
|
|
end
|
|
|
|
function fs.mkdir(s)
|
|
|
|
local _,d,p = fs.resolve(s)
|
|
|
|
return fT[d].makeDirectory(p or "/")
|
|
|
|
end
|
|
|
|
function fs.rm(s)
|
2017-08-01 15:45:22 +10:00
|
|
|
local _,d,p = fs.resolve(s)
|
2017-08-01 14:36:38 +10:00
|
|
|
return fT[d].remove(p)
|
|
|
|
end
|
|
|
|
function fs.exists(s)
|
2017-08-01 15:45:22 +10:00
|
|
|
local _,d,p = fs.resolve(s)
|
2017-08-04 17:44:10 +10:00
|
|
|
if d then
|
|
|
|
return fT[d].exists(p)
|
|
|
|
end
|
2017-08-01 14:36:38 +10:00
|
|
|
end
|
|
|
|
function fs.isdir(s)
|
2017-08-01 15:45:22 +10:00
|
|
|
local _,d,p = fs.resolve(s)
|
2017-08-01 14:36:38 +10:00
|
|
|
return fT[d].isDirectory(p)
|
|
|
|
end
|
2017-07-31 12:10:07 +10:00
|
|
|
end
|
2017-08-01 16:29:56 +10:00
|
|
|
function fs.cd(p)
|
|
|
|
if p:sub(1,1) ~= "/" then
|
|
|
|
p=(os.getenv("PWD") or "").."/"..p
|
|
|
|
end
|
|
|
|
p=fs.simplify(p)
|
|
|
|
if fs.exists(p) and fs.isdir(p) then
|
|
|
|
os.setenv("PWD",p)
|
|
|
|
else
|
|
|
|
error("non-existent/not a dir")
|
|
|
|
end
|
|
|
|
end
|
2017-08-31 12:31:54 +10:00
|
|
|
function fs.cp(s,d)
|
|
|
|
local df = fs.open(d,"wb")
|
|
|
|
local sf = fs.open(s,"rb")
|
|
|
|
fs.write(df,fs.readall(sf))
|
|
|
|
fs.close(df)
|
|
|
|
fs.close(sf)
|
|
|
|
end
|
|
|
|
function fs.mv(s,d)
|
|
|
|
fs.cp(s,d)
|
|
|
|
fs.rm(s)
|
|
|
|
end
|