106 lines
3.1 KiB
Lua
106 lines
3.1 KiB
Lua
local fs=love.filesystem
|
|
local FILE={}
|
|
function FILE.load(name,args)
|
|
if not args then args=''end
|
|
if fs.getInfo(name)then
|
|
local F=fs.newFile(name)
|
|
assert(F:open'r','open error')
|
|
local s=F:read()F:close()
|
|
local mode=
|
|
STRING.sArg(args,'-luaon')and'luaon'or
|
|
STRING.sArg(args,'-lua')and'lua'or
|
|
STRING.sArg(args,'-json')and'json'or
|
|
STRING.sArg(args,'-string')and'string'or
|
|
s:sub(1,6)=='return{'and'luaon'or
|
|
(s:sub(1,1)=='['and s:sub(-1)==']'or s:sub(1,1)=='{'and s:sub(-1)=='}')and'json'or
|
|
'string'
|
|
if mode=='luaon'then
|
|
local func,err_mes=loadstring(s)
|
|
if func then
|
|
setfenv(func,{})
|
|
local res=func()
|
|
return assert(res,'decode error')
|
|
else
|
|
error('decode error: '..err_mes)
|
|
end
|
|
elseif mode=='lua'then
|
|
local func,err_mes=loadstring(s)
|
|
if func then
|
|
local res=func()
|
|
return assert(res,'run error')
|
|
else
|
|
error('compile error: '..err_mes)
|
|
end
|
|
elseif mode=='json'then
|
|
local res=JSON.decode(s)
|
|
if res then
|
|
return res
|
|
end
|
|
error('decode error')
|
|
elseif mode=='string'then
|
|
return s
|
|
else
|
|
error('unknown mode')
|
|
end
|
|
else
|
|
error('no file')
|
|
end
|
|
end
|
|
function FILE.save(data,name,args)
|
|
if not args then args=''end
|
|
if STRING.sArg(args,'-d')and fs.getInfo(name)then
|
|
error('duplicate')
|
|
end
|
|
|
|
if type(data)=='table'then
|
|
if STRING.sArg(args,'-luaon')then
|
|
data=TABLE.dump(data)
|
|
if not data then
|
|
error('encode error')
|
|
end
|
|
else
|
|
data=JSON.encode(data)
|
|
if not data then
|
|
error('encode error')
|
|
end
|
|
end
|
|
else
|
|
data=tostring(data)
|
|
end
|
|
|
|
local F=fs.newFile(name)
|
|
assert(F:open('w'),'open error')
|
|
F:write(data)F:flush()F:close()
|
|
end
|
|
function FILE.clear(path)
|
|
if fs.getRealDirectory(path)==SAVEDIR and fs.getInfo(path).type=='directory'then
|
|
for _,name in next,fs.getDirectoryItems(path)do
|
|
name=path..'/'..name
|
|
if fs.getRealDirectory(name)==SAVEDIR then
|
|
local t=fs.getInfo(name).type
|
|
if t=='file'then
|
|
fs.remove(name)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
function FILE.clear_s(path)
|
|
if path==''or(fs.getRealDirectory(path)==SAVEDIR and fs.getInfo(path).type=='directory')then
|
|
for _,name in next,fs.getDirectoryItems(path)do
|
|
name=path..'/'..name
|
|
if fs.getRealDirectory(name)==SAVEDIR then
|
|
local t=fs.getInfo(name).type
|
|
if t=='file'then
|
|
fs.remove(name)
|
|
elseif t=='directory'then
|
|
FILE.clear_s(name)
|
|
fs.remove(name)
|
|
end
|
|
end
|
|
end
|
|
fs.remove(path)
|
|
end
|
|
end
|
|
return FILE
|