Получить текущий рабочий каталог в 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, но это, вероятно, не то, что вы ищете.

Другие вопросы по тегам