получить текущий рабочий каталог в Lua - PullRequest
15 голосов
/ 17 мая 2011

Что такое Lua для получения текущего рабочего каталога в Windows XP SP3 (или для получения каталога текущего запущенного файла Lua)?Я предпочитаю , а не использовать LuaFileSystem .

Я не могу использовать os.execute("cd"), потому что os.execute всегда начинается с моего домашнего каталога (и, следовательно, всегда дает C:\Documents and Settings\username).

Ответы [ 5 ]

16 голосов
/ 18 мая 2011

может быть, какой-то уродливый хак, как

current_dir=io.popen"cd":read'*l'
8 голосов
/ 18 мая 2011

Lua по умолчанию не имеет "родного" способа поддержки концепции "текущего каталога" или, фактически, концепции "каталога".

Правильный способ получить текущий каталог - использовать библиотеку, которая обеспечивает поддержку папок. Их несколько - я рекомендую luafilesystem .

После установки вы можете получить текущий каталог, выполнив:

lfs.currentdir()

Это будет работать на Windows, Linux и Mac.

Обратите внимание, что эти внешние библиотеки обычно включают в себя некоторые двоичные пакеты. В зависимости от ваших настроек, вам, возможно, придется скомпилировать его, прежде чем вы сможете его использовать.

EDIT:

Обратите внимание, что когда файл включается через require, выражение {...}[1] возвращает путь, используемый директивой require. Это не совсем путь, потому что:

  • Он использует точки для разделения каталогов и подавляет .lua в конце файла.
  • Относительно пути, с которого был инициализирован процесс lua
  • Зависит от конфигурации package.path

Но если вам нужен только «требуемый путь» файла (возможно, требующий файлы рядом с ним), вы можете получить его, выполнив это в самом начале файла:

local PATH = (...):match("(.+)%.[^%.]+$") or (...)

Если файл с именем baz.lua требуется с require 'foo.bar.baz', тогда PATH будет foo.bar.

7 голосов
/ 05 октября 2011

Вы сможете получить текущий путь к файлу 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"

2 голосов
/ 17 мая 2011

У меня не было времени проверить это, но вы пробовали os.getenv для чтения переменных среды Windows?

В Windows есть переменная среды для текущего каталога: % CD%

os.getenv("CD")

Редактировать: Протестировано в Windows 7 и во время работы других переменных среды (т. Е.% USERNAME% или% PROGRAMFILES%) CD var возвращает nil

0 голосов
/ 19 мая 2011

Вы можете использовать alien для вызова GetCurrentDirectory в kernel32.dll , но это, вероятно, не то, что вы ищете.

...