如何检测添加到特定目录的新文件?
我正在寻找的是一个类似于 event_listener 的东西,用于创建新文件时。我对使用不断在目录中搜索新文件的循环不感兴趣,因为在将文件添加到目录时我需要文件名。
如何检测添加到特定目录的新文件?
我正在寻找的是一个类似于 event_listener 的东西,用于创建新文件时。我对使用不断在目录中搜索新文件的循环不感兴趣,因为在将文件添加到目录时我需要文件名。
不幸的是,没有原生的 Erlang API来执行你正在寻找的东西。
任何非轮询解决方案都必须依赖操作系统的特定 API。在 MacOS X 和 FreeBSD 上,您可以使用kqueue(2) API。在 Linux 上,您可以使用inotify(7) API。这两个 API 都与select(2)一起工作,您可以使用 Erlang 的driver_select函数来选择这些 API 提供的文件描述符。编写这样的驱动程序并不是特别困难。
您可以在 Github 上找到几个用于 inotify的驱动程序和一个用于 kqueue的驱动程序。
如果您正在使用类似 Unix 的操作系统,您应该考虑使用 inotifywait 工具。我刚刚在有用的系统工具周围找到了不错的 Erlang 包装器:https ://github.com/sdanzan/erlang-systools
inoteefy在 Linux api 之上为您提供了一个很好的基于侦听器的inotify
api。收听更新的示例/tmp/
:
1> inoteefy:watch("/tmp/", fun(X) -> io:format("File event: ~p~n", [X]) end).
ok
File event: {"/tmp/",[create],0,"foo.txt"}
File event: {"/tmp/",[open],0,"foo.txt"}
File event: {"/tmp/",[attrib],0,"foo.txt"}
File event: {"/tmp/",[close_write],0,"foo.txt"}
在这里我touch /tmp/foo.txt
在启动手表后做