防止文件被重复写入而没有使用file:close()关闭文件
2019-11-5 10:41:41
收藏:0
阅读:186
评论:3
我正在开发一个日志系统,但我在使用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()将是一个巨大的问题。
点赞
用户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
对于我的特定情况,我找到了一个解决方案 - 因为我只想要一个选项来打印,而且它是最后一个选项(而不是第一个,我应该指定这一点),我只需要将一个变量设置为我想要的输出,然后在末尾写入它。
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
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

正如 Egor Skriptunoff 已经说过的那样,我建议您编写自己的写入函数。我通常使用如下代码:
local function writeFile(filePath, str) local outfile = io.open(filePath, 'w') outfile:write(str) outfile:close() end如果要将内容追加到文件中,只需将模式从
w更改为a即可。