注意:
1)目前只支持对文件进行读写,暂时不支持读取文本流,已经预留接口,可以自行实现。
2)设计成类,可以同时加载多个ini文件
以下为代码:
module(..., package.seeall)
iniClass = {
path = nil,
}
function iniClass:new(o)
local o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function iniClass:loadFromFile( srcName, srcPath )
self.path = system.pathForFile( srcName, srcPath )
local fh = io.open( self.path )
--no such file, create it
if not fh then
fh = io.open(self.path, "w")
if fh then
fh:close()
fh = io.open( self.path )
else
print("create file failed")
end
end
local sect = nil
for line in fh:lines() do
line = string.gsub(line, "%s*;.*", "")
s, e, n = string.find(line, "%[(.+)%]")
if s then
self[n] = {}
sect = n
--print(n)
else
s, e, k, v = string.find(line, "(%w+)=(.*)")
if s then
--print(s, e, k, v, sect)
self[sect][k] = string.gsub(v,"\r","")
end
end
end
fh:close()
end
function iniClass:loadFromString( source )
end
function iniClass:dataToString()
local data = ""
for k,v in pairs(self) do
--print(k, v)
if type(v) == "table" then
if string.len(data) == 0 then
data = "[" .. k .. "]"
else
data = data .. "\r\n" .. "[" .. k .. "]"
end
--print(data)
for a, b in pairs(v) do
data = data .. "\r\n" .. a .. "=" .. b
end
end
end
--print(data)
return data
end
function iniClass:save()
if self.path then
local wfh = io.open( self.path, "wb" )
if wfh then
wfh:write( self:dataToString() )
wfh:close()
end
end
end
function iniClass:print()
for k,v in pairs(self) do
print(k, v)
end
end
function new()
local ret = iniClass:new()
return ret
end
示例:
cfg = ini.new()
cfg:loadFromFile("cfg.txt", system.DocumentsDirectory)
print(cfg["system"]["version"])