3

我有以下代码:

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 上启动应用程序时看到。我希望程序将时间、日期和应用程序的名称记录在一个文件中,以便我可以看到我启动了哪些应用程序以及何时启动。

似乎没有任何东西可以登录到我的文本文件中。为什么?

4

1 回答 1

3

文件 I/O 被缓冲。这意味着数据并不总是立即写入文件,而是保存在内存中,直到缓冲区已满,以便可以批量写入数据。

简单的解决方法是简单地使用file:flush来立即将数据从缓冲区推送到文件中。

data:write('name and timestamp')
data:flush()

更高级的解决方案是使用file:setvbuf设置适当的mode, 和 buffer size

file:setvbuf (mode [, size])

设置输出文件的缓冲模式。共有三种可用模式:

  • "no":没有缓冲;任何输出操作的结果都会立即出现。
  • “full”:完全缓冲;仅当缓冲区已满或显式刷新文件时才执行输出操作(请参阅 参考资料io.flush)。
  • “line”:行缓冲;输出被缓冲,直到输出换行符或来自某些特殊文件(例如终端设备)的任何输入。

对于最后两种情况,size 指定缓冲区的大小,以字节为单位。默认值是适当的大小。

您可能想要的是'line'缓冲,因为无论如何您都应该在字符串的末尾添加一个换行符 ( '\n'),否则您的日志文件将很难阅读。

local data = io.open("test.txt", "a")
data:setvbuf('line')
于 2016-10-28T16:44:06.763 回答