Написах функция getScriptDir
, която използва информацията за отстраняване на грешки, както няколко други хора предложиха, но тази ще работи всеки път (поне в Windows). Но работата е там, че има доста редове код, тъй като използва друга функция string.cut
, която създадох, която разделя низ всеки даден шаблон и го поставя в таблица.
function string.cut(s,pattern)
if pattern == nil then pattern = " " end
local cutstring = {}
local i1 = 0
repeat
i2 = nil
local i2 = string.find(s,pattern,i1+1)
if i2 == nil then i2 = string.len(s)+1 end
table.insert(cutstring,string.sub(s,i1+1,i2-1))
i1 = i2
until i2 == string.len(s)+1
return cutstring
end
function getScriptDir(source)
if source == nil then
source = debug.getinfo(1).source
end
local pwd1 = (io.popen("echo %cd%"):read("*l")):gsub("\\","/")
local pwd2 = source:sub(2):gsub("\\","/")
local pwd = ""
if pwd2:sub(2,3) == ":/" then
pwd = pwd2:sub(1,pwd2:find("[^/]*%.lua")-1)
else
local path1 = string.cut(pwd1:sub(4),"/")
local path2 = string.cut(pwd2,"/")
for i = 1,#path2-1 do
if path2[i] == ".." then
table.remove(path1)
else
table.insert(path1,path2[i])
end
end
pwd = pwd1:sub(1,3)
for i = 1,#path1 do
pwd = pwd..path1[i].."/"
end
end
return pwd
end
Забележка: ако искате да използвате тази функция в друга операционна система, различна от Windows, трябва да промените io.popen("echo %cd%")
в ред 15 на командата, която ви дава настояща работна директория във вашата операционна система , напр. io.popen("pwd")
за Linux и pwd2:sub(2,3) == ":/"
в ред 18 към всичко, което представлява главната директория във вашата операционна система, напр. pwd2:sub(1,1) == "/"
за Linux.
Забележка 2: ако не предоставите променливата source
на функцията чрез debug.getinfo(1).source
, когато я извиквате, тогава тя ще върне пътя към директорията на файла, съдържащ тази функция. Следователно, ако искате да получите директорията на файл, който сте извикали чрез dofile
или loadfile
, ще трябва да му дадете източника, както следва: getScriptDir(debug.getinfo(1).source)
.
person
Amine Kchouk
schedule
05.12.2017