He escrito una función getScriptDir
que utiliza la información de depuración al igual que algunas otras personas han sugerido, pero éste se va a trabajar cada vez (por lo menos en Windows). Pero la cosa es que hay bastantes líneas de código ya que usa otra función string.cut
que he creado, que separa una cadena de cada patrón dado, y la coloca en una tabla.
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
Nota: si desea utilizar esta función en otro sistema operativo que no sea Windows, usted tiene que cambiar el io.popen("echo %cd%")
en la línea 15 a cualquier comando que da presentes directorio de trabajo en su sistema operativo, por ejemplo, io.popen("pwd")
para Linux, y pwd2:sub(2,3) == ":/"
en la línea a lo que represente el directorio raíz en su sistema operativo, p. Ej. pwd2:sub(1,1) == "/"
para Linux.
Nota 2: si no se proporciona la variable source
a la función a través de debug.getinfo(1).source
cuando se llama a ella, entonces se devuelve la ruta hasta el directorio del archivo que contiene esta función .Por lo tanto, si desea obtener el directorio de un archivo que llamó a través del dofile
o loadfile
, tendrá que darle la fuente, como este: getScriptDir(debug.getinfo(1).source)
.
Si hice dofile (subarchivo) dentro del original, ¿funcionaría este método para obtener la ruta del subarchivo? – radman
@radman: no. Además, 'dofile' usa cualquier ruta que se encuentre y, por lo tanto, las rutas relativas son relativas al directorio de trabajo actual del proceso. Si desea rastrear archivos entregados a 'dofile', puede redefinirlo. – lhf
y el usuario también podría usar loadfile y luego ejecutar el archivo cargado como una llamada de función, puede que tenga que redefinir también el archivo de carga –