Erlang';s ssh_sftp库提供了一种侦听目录更改的方法?
我需要观看或收听SFTP服务器上的文件夹中的任何更改。在将来的某个特定时间(我不知道什么时候),文件夹将被更新为一个文件。我如何在该文件夹上设置侦听器或监视程序,以便知道它何时有该文件,而不是每分钟ping一次?Erlang的Erlang';s ssh_sftp库提供了一种侦听目录更改的方法?,erlang,elixir,Erlang,Elixir,我需要观看或收听SFTP服务器上的文件夹中的任何更改。在将来的某个特定时间(我不知道什么时候),文件夹将被更新为一个文件。我如何在该文件夹上设置侦听器或监视程序,以便知道它何时有该文件,而不是每分钟ping一次?Erlang的ssh\u sftp模块是否提供了此功能?sftp和FTP协议都没有任何机制通知客户端远程文件夹中的更改。检测更改的唯一解决方案是定期枚举远程目录树并找出差异 Ref:我不知道您是否还需要它,但我已经实现了您所需要的。由于法律协议,我将无法共享代码,但是我可以提示您实现它的
ssh\u sftp
模块是否提供了此功能?sftp和FTP协议都没有任何机制通知客户端远程文件夹中的更改。检测更改的唯一解决方案是定期枚举远程目录树并找出差异
Ref:我不知道您是否还需要它,但我已经实现了您所需要的。由于法律协议,我将无法共享代码,但是我可以提示您实现它的方法 要求:只要文件到达目录,就运行函数,而不是按定义的间隔轮询目录,以提高处理效率 步骤1:以sftp作为子系统启动ssh守护进程
{ok, Pid} = ssh:daemon(Port, [{user_passwords, [{User, Pass}]},
{system_dir, SystemDir},
{user_dir, UserDir},
{key_cb, cac_auth},
{shell, {cacsftpd_server, display_info, []}},
{subsystems, [ssh_sftpd:subsystem_spec([{cwd,
Home}, {file_handler, sftpd_file_handler}])]}])
步骤2:在sftpd_文件_处理程序中,您可以在文件完全传输后应用触发器调用所需的处理程序;)) 虽然不是在Erlang中,而是在Elixir中,请看: 基本位是写入功能:
defmodule Exsftpd.SftpFileHandler do
...
def write(io_device, data, state) do
{:file.write(io_device, data), state}
my_custom_function(state)
{:ok, state}
end
...
end
在这里,您可以在将内容写入(或代替)文件系统后调用所需的任何函数
按如下方式初始化服务器:(有关更详细的示例,请参阅):
这不是执行此操作的
ssh\u sftp
模块的角色。你可以阅读这篇相关的文章。
:ssh.daemon(2222,
system_dir: '/tmp/ssh',
subsystems: [
Exsftpd.SftpdChannel.subsystem_spec(
file_handler: {Exsftpd.SftpFileHandler, []}
)
],
user_dir: '/tmp/ssh/users'
)