防止文件被重复写入而没有使用file:close()关闭文件

我正在开发一个日志系统,但我在使用for循环和文件写入时遇到问题。下面是一个简单的例子:

file = io.open("text.txt","a") -- text.txt 可以是任何内容
for i=1,8 do
  if x==true then
    file:write("X is true.")
  elseif y==true then
    file:write("Y is true.")
  end
end

是否有一种方法可以防止文件被重复写入而没有使用file:close()关闭文件?由于我有大量不同的file:write部分,在所有这些部分后添加file:close()将是一个巨大的问题。

点赞
用户10126088
用户10126088

正如 Egor Skriptunoff 已经说过的那样,我建议您编写自己的写入函数。我通常使用如下代码:

local function writeFile(filePath, str)
  local outfile = io.open(filePath, 'w')
  outfile:write(str)
  outfile:close()
end

如果要将内容追加到文件中,只需将模式从 w 更改为 a 即可。

2019-11-05 16:06:19
用户3371355
用户3371355

如果每次调用file:close()有很大的问题,那么这就是您需要的自定义逻辑。

myFileMetatable = {}  --在此实现所有必要的文件操作
function myFileMetatable.write(self, str)
    if not self.written then
        self.written = true
        self.f:write(str)
    end
end
function myFileMetatable.close(self)
    self.f:close()
end

myFile = {}
function myFile.open(filename, mode)
    local t = {f = io.open(filename, mode)}
    setmetatable(t, {__index = myFileMetatable})
    return t
end

--现在您可以执行以下操作
file = myFile.open("test", "w")
file:write("test")
file:write("hello")
file:write("world")
file:close()    --只有“test”会被写入

请注意,这可能比将file:write(str)替换为file_write(file,str)要好得多,因为您需要在某处存储文件已经被写入的事实,但是不能将其存储在FILE *对象内,而使用全局变量将在使用多个文件时出现问题。这就是我将FILE *对象封装在一个表中并使用myFileMetatable实现我自己的方法所以我需要。

但是,如果您每次只需要一个文件并且不介意全局变量,则这更有效率。

file_written = false
function file_write(file, str)
    if not file_written then
        file_written = true
        file:write(str)
    end
end

file = io.open("test", "w")
file_write(file, "test")
file_write(file, "hello")
file_write(file, "world")
file:close()

注意,它不如第一个示例漂亮,并且在未来可能会遇到问题,如果您决定扩展到一个以上的文件。

2019-11-06 08:36:17
用户11405174
用户11405174

对于我的特定情况,我找到了一个解决方案 - 因为我只想要一个选项来打印,而且它是最后一个选项(而不是第一个,我应该指定这一点),我只需要将一个变量设置为我想要的输出,然后在末尾写入它。

log = ""
if x == 2 then
  log = "X is 2."
elseif y == 2 then
  log = "Y is 2."
end
file:write(log)

对于最后一个选项,我会参考任何人的最佳答案,它应该是完美的。

2019-11-06 09:17:18