写操作后数据不出现在日志文件中

时间:2016-10-28 13:23:54

标签: file lua hammerspoon

我有以下代码:

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上启动应用程序时,此代码会看到。我希望程序将时间,日期和应用程序的名称记录在一个文件中,这样我就可以看到我发布的应用程序以及何时发布。

似乎没有任何内容登录到我的文本文件中。为什么?

1 个答案:

答案 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')