Windows系统下Lua os.tmpname()函数返回路径问题咨询
问题1解答:以单个反斜杠开头的Windows路径属性
这类路径在Windows文件系统规则中属于根相对路径,既不是标准的相对路径(相对当前工作目录),也不是完整的绝对路径:
- 它的实际指向是当前工作目录所在驱动器的根目录,而非当前工作目录本身。比如你当前工作目录为
D:\projects\lua,那\s3e8.对应的完整路径是D:\s3e8.,这也是你直接调用io.open会尝试在根目录创建文件的原因。 - 你之前看到的旧讨论帖中“相对于当前工作目录”的描述是错误的,不符合微软现行的Windows路径规范。
问题2解答:os.tmpname()不读取TMP环境变量的原因
你看到的读取TMP环境变量的规则是微软CRT库_tempnam()函数的专属逻辑,而Lua官方实现的os.tmpname()底层直接调用的是标准C库的tmpnam()函数,两者的行为逻辑完全不同:
- 标准C的
tmpnam()在Windows CRT的实现中,本身就不会读取TMP环境变量,默认只会生成这种根相对的短路径,这是标准库实现的固有行为,和你是否配置TMP环境变量无关。 - 你使用的Lua 5.2以及mpv内置的静态编译Lua,都没有对
os.tmpname()做Windows平台的适配修改,所以都会表现出相同的行为。
临时解决方案
如果需要生成符合预期的临时文件路径,可以手动实现逻辑:
- 先用
os.getenv("TMP")读取系统临时目录 - 拼接上
os.tmpname()返回的文件名部分(去掉开头的反斜杠) - 再调用
io.open操作拼接后的完整路径
也可以直接使用io.tmpfile()函数,它会直接在系统临时目录创建临时文件并返回句柄,无需自行处理路径。
内容的提问来源于stack exchange,提问作者what the
相关产品推荐
相关产品推荐

