我有以下代码:
time = os.date("*t")
data = io.open("test.txt", "a")
function applicationWatcher(appName, eventType, appObject)
if (eventType == hs.application.watcher.launched) then
data:write("" .. appName .. " launched at ".. ("%02d:%02d:%02d:%02d:%02d:%02d"):format(time.day, time.month, time.year, time.hour, time.min, time.sec))
end
end
local appWatcher = hs.application.watcher.new(applicationWatcher)
appWatcher:start()
当您在macOS上启动应用程序时,此代码会看到。我希望程序将时间,日期和应用程序的名称记录在一个文件中,这样我就可以看到我发布的应用程序以及何时发布。
似乎没有任何内容登录到我的文本文件中。为什么?
答案 0 :(得分:3)
文件I / O为buffered。这意味着数据并不总是立即写入文件,而是保存在内存中,直到缓冲区已满,这样数据就可以批量写入。
简单的解决方法是简单地使用file:flush
立即将数据从缓冲区推送到文件中。
data:write('name and timestamp')
data:flush()
更高级的解决方案是使用file:setvbuf
设置相应的mode
和缓冲区size
:
file:setvbuf (mode [, size])
设置输出文件的缓冲模式。有三种可用模式:
- “不”:没有缓冲;任何输出操作的结果都会立即显示。
- “full”:完全缓冲;仅当缓冲区已满或明确刷新文件时才执行输出操作(请参阅
io.flush
)。- “line”:行缓冲;输出被缓冲,直到输出换行或某些特殊文件(例如终端设备)有任何输入。
对于最后两种情况,size指定缓冲区的大小(以字节为单位)。默认值是合适的大小。
您可能想要的是'line'
缓冲,因为您应该在字符串的末尾添加换行符('\n'
),否则您的日志文件将很难阅读。 / p>
local data = io.open("test.txt", "a")
data:setvbuf('line')