Получить текущий рабочий каталог в Lua
Что такое Lua для получения текущего рабочего каталога в Windows XP SP3 (или для получения каталога текущего запущенного файла Lua)? Я предпочитаю не использовать LuaFileSystem.
Я не могу использовать os.execute("cd")
так как os.execute
всегда начинается с моего домашнего каталога (и, следовательно, всегда дает C:\Documents and Settings\username
).
6 ответов
Lua по умолчанию не имеет "родного" способа поддержки концепции "текущего каталога" или, по сути, концепции "каталога".
Правильный способ получить текущий каталог - использовать библиотеку, которая обеспечивает поддержку папок. Их несколько - я рекомендую luafilesystem.
После его установки вы можете получить текущий каталог, выполнив:
lfs.currentdir()
Это будет работать на Windows, Linux и Mac.
Помните, что эти внешние библиотеки обычно включают в себя несколько бинарных пакетов. В зависимости от ваших настроек, вам, возможно, придется скомпилировать его, прежде чем вы сможете его использовать.
РЕДАКТИРОВАТЬ:
Обратите внимание, что когда файл включен через require
тогда выражение {...}[1]
возвращает путь, используемый require
директивы. Это не совсем путь, потому что:
- Он использует точки для разделения каталогов и подавляет
.lua
в конце файла. - Относительно пути, с которого был инициализирован процесс lua
- Это зависит от конфигурации
package.path
Но если все, что вам нужно, это "путь по требованию" файла (возможно, требующий файлы рядом с ним), то вы можете получить его, выполнив это в самом начале файла:
local PATH = (...):match("(.+)%.[^%.]+$") or (...)
Если файл называется baz.lua
требуется с require 'foo.bar.baz'
, затем PATH
будет foo.bar
,
Может быть, какой-то уродливый хак
current_dir=io.popen"cd":read'*l'
Вы должны быть в состоянии получить текущий путь к файлу lua с помощью:
debug.getinfo(1).short_src;
или же
debug.getinfo(1).source;
а затем текущий каталог с регулярным выражением:
string.gsub(debug.getinfo(1).short_src, "^(.+\\)[^\\]+$", "%1");
Редактировать: на самом деле это работает, только если вы запускаете свой lua с полным путем. Например: "lua.exe C:\test\test.lua" и НЕ "lua.exe test.lua"
У меня не было времени, чтобы проверить это, но вы пробовали os.getenv для чтения переменных среды Windows?
В Windows есть переменная окружения для текущего каталога: % CD%
os.getenv("CD")
Редактировать: протестировано в Windows 7, и в то время как другие переменные среды работают (т. Е. %USERNAME% или%PROGRAMFILES%), CD var возвращает nil
Я пробовал все эти ответы, но ничего не получилось. Я протестировал следующий скрипт, и он работает так, как ожидалось.
io.popen("cd"):read()
Вы можете использовать alien для вызова GetCurrentDirectory в kernel32.dll, но это, вероятно, не то, что вы ищете.