有没有办法重定向 lua 中 io.open 加载自定义函数的文件?

我正在使用嵌入式 Lua。在我的情况下,我想从虚拟内存文件系统(基于 .zip 文件)中加载文件,而不是真正的文件系统。

为了实现这一点,我认为我需要重定向/覆盖所有内部的 fopen 调用,使其仅查看 .zip 文件的内容。这似乎不可能,是吗?

如何创建安全的 Lua 沙箱?

这里有一个快速的例子:

这段代码会打开一个文本文件并将其内容读入一个本地变量。在内部,它似乎使用 fopen(),这意味着它只会使用真正的文件系统。

local f = io.open('filename.txt')
local t = f:read("*all")
f:close()

相反,我希望它在内部调用我的"假"文件系统,并从假文件系统返回文件的内容。

我已经成功地为仅加载 .lua 文件的情况实现了类似的功能。这是通过添加一个自定义的搜索器/加载器来实现的,它从 .zip 文件中加载文件。现在,require("something.lua") 只从虚假文件系统中加载,这很完美。

但是,load()dofile()loadfile()仍在工作,并使用 fopen()。目前我正在将它们设置为 nil,直到我找到更好的解决方案。

load = nil
dofile = nil
loadfile = nil

从某种程度上讲,我认为我真正想做的是将所有文件系统调用重定向到其他地方。

不管怎样,我将此 SO 问题的范围缩小,只问关于 io.open 的问题。我应该用自己的函数替换/重定向 lua 中的 io.open,使其从我的虚拟文件系统中加载吗?我是否需要重新定义 io 命名空间?

点赞