Lua检查文件是否打开

Lua检查文件是否打开,lua,Lua,我正在尝试编写lua文件的脚本,以检查某个文件是否已打开。然后,我希望它关闭该文件,如果它是打开的。我知道如何检查文件是否存在,但我需要知道如何检查文件是否打开,这意味着文件正在运行。 Lua,像C,C++,以及几乎所有其他语言,只能关闭它自己打开的文件。您不能关闭其他人打开的文件(不使用标准Lua调用);这将是非常粗鲁的 因此,您无法测试文件是否由其他人打开。你也不能关闭他们的文件。您可以通过系统API调用来实现这一点,但您必须自己为Lua脚本提供访问这些API的权限。Lua的标准库无法做到

我正在尝试编写lua文件的脚本,以检查某个文件是否已打开。然后,我希望它关闭该文件,如果它是打开的。我知道如何检查文件是否存在,但我需要知道如何检查文件是否打开,这意味着文件正在运行。

Lua,像C,C++,以及几乎所有其他语言,只能关闭它自己打开的文件。您不能关闭其他人打开的文件(不使用标准Lua调用);这将是非常粗鲁的


因此,您无法测试文件是否由其他人打开。你也不能关闭他们的文件。您可以通过系统API调用来实现这一点,但您必须自己为Lua脚本提供访问这些API的权限。Lua的标准库无法做到这一点。

听起来您想检查哪些程序打开了给定的文件。 首先想到的是在linux上解析lsof的输出

fd = io.popen("lsof path/to/my/file")
fileopened = (#fd:read("a*") > 0)

这有点老套,但它很有效:

processname = "process_name_here.exe"

filedata = io.popen("tasklist /NH /FO CSV /FI \"IMAGENAME eq "..processname.."\"")
output = filedata:read()
filedata:close()

if output ~= "INFO: No tasks are running which match the specified criteria." then
    -- Program is running. Close the program
    os.execute("taskkill -im "..processname)
else
    -- Program is not running
end
只需确保用任务管理器中显示的进程名称替换“process_name_here.exe”

或者,您可以使用此选项关闭它,而不检查它是否实际运行:

os.execute("taskkill -im process_name_here.exe")

定义“文件正在运行”。如果您的应用程序在linux上运行,并且您绝对确定不会伤害任何人(或者您的BSOF不在乎),或者是您自己的进程打开了一个文件,则可以使用
fuser