【问题标题】:Understanding Lua's os.tmpname() on Windows在 Windows 上理解 Lua 的 os.tmpname()
【发布时间】:2021-11-24 08:03:52
【问题描述】:

我正在尝试在 Windows 上使用 Lua 的 os.tmpname()(在后台使用 tmpnam()),但我对它返回的文件名感到有些困惑。

> print(os.tmpname())
\s3e8.

如果我像io.open(os.tmpname(), "w") 那样直接将它提供给 Lua,它将尝试在当前驱动器的根目录中创建文件。这似乎很不合适,因为我们通常无权这样做。

但是根据这个帖子:

https://mingw-users.narkive.com/L7VR1gxX/temporary-file-woes

这显然应该是相对于当前目录的路径。他们从 Microsoft 文档中提到了这个 sn-p:

请注意,当文件名前面带有反斜杠且没有路径时 信息,例如\fname21,这表明该名称是有效的 对于当前工作目录。

但是我再也找不到他们在帖子中提到的文档了。 我四处搜索,试图找到最新的文档并找到了这个: https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tempnam-wtempnam-tmpnam-wtmpnam?view=msvc-160

这是上面文档中提到的生成规则:

_tempnam 将为通过以下规则选择的目录生成唯一的文件名:

如果定义了 TMP 环境变量并将其设置为有效 目录名,将为目录生成唯一的文件名 由 TMP 指定。

如果未定义 TMP 环境变量或将其设置为 不存在的目录的名称,_tempnam 将使用该目录 参数作为它将为其生成唯一名称的路径。

如果未定义 TMP 环境变量或将其设置为 不存在的目录的名称,如果 dir 为 NULL 或 设置为不存在的目录的名称,_tempnam 将使用 当前工作目录生成唯一名称。目前,如果 TMP 和 dir 都指定不存在的目录的名称, _tempnam 函数调用将失败。

我确实定义了 TMP 环境变量,但 Lua 总是生成我在顶部提到的那种路径。

真的,我有两个问题:

  1. 这实际上应该是相对路径吗?
  2. 如果是这样,为什么它总是生成相对路径,而不是使用标准的TMP 变量?

我正在使用来自 LuaBinaries 的 Lua 5.2 和静态内置到 shinchiro 的 mpv 构建中的 Lua 进行测试。

【问题讨论】:

    标签: c lua


    【解决方案1】:

    根据 lua-users.org 上的this thread,您可以尝试传递 null。

    我使用 tmpname(NULL,NULL) 解决了它...它认为 系统的临时目录。 当我在不可写根的 Windows 上使用 tmpnam() 时,文件名 生成的 (\something) 不可写... 我猜这是一个实现错误

    还要注意Lua 5.2 Reference Manual

    如果可能,您可能更喜欢使用io.tmpfile,它会在程序结束时自动删除文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 2017-11-07
      • 2018-09-03
      相关资源
      最近更新 更多