18

在 Windows XP SP3 上获取当前工作目录的 Lua 是什么(或获取当前运行的 Lua 文件的目录)?我喜欢使用LuaFileSystem

我不能使用os.execute("cd"),因为os.execute总是从我的主目录开始(因此总是 yield C:\Documents and Settings\username)。

4

5 回答 5

18

也许像一些丑陋的黑客

current_dir=io.popen"cd":read'*l'
于 2011-05-17T20:43:25.100 回答
11

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

于 2011-05-18T14:28:19.227 回答
8

您应该能够通过以下方式获取当前运行的 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”

于 2011-10-04T20:28:16.080 回答
5

我没有时间对此进行测试,但是您是否尝试过os.getenv来读取 Windows 环境变量?

Windows 有一个当前目录的环境变量:%CD%

os.getenv("CD")

编辑:在 Windows 7 上测试,当其他环境变量工作时(即 %USERNAME% 或 %PROGRAMFILES%),CD var 返回 nil

于 2011-05-17T16:50:51.487 回答
0

您可以使用外星人在 kernel32.dll中调用GetCurrentDirectory,但这可能不是您想要的。

于 2011-05-19T15:32:31.340 回答