我们有一个应用程序需要处理放入目录的传入文件。 我正在寻找最好的方法来做到这一点。
我们一直在使用循环的Backgroundrb流程,但是,说实话,Backgroundrb是不可靠的,如果可能的话,我们希望远离它。
Delayed_job似乎不是用于正在进行的任务,而是用于一次性。
我发现DirectoryWatcher http://codeforpeople.rubyforge.org/directory_watcher/看起来很有前途,但理想情况下我们希望对此有一些控制权,并且能够监控它是否已启动。
所以要求是:
感谢任何输入!这应该不难,我很惊讶我找不到其他人在网上谈论这个,因为我认为在商业应用中这并不罕见。
答案 0 :(得分:12)
感谢@emerge,作为rails的相对新手,我想在我的Rails应用程序中查看文件,而不是从命令行查看。与此处的其他选项相比,发现Listen是一个非常简单的两个步骤:
将此添加到gem文件:
gem 'listen', '~> 2.0'
然后在Application.rb中添加它以在应用启动时执行:
listener = Listen.to('public/json_import') do |added|
puts "added absolute path: #{added}"
end
listener.start # not blocking
我们也可以收听多个目录,还可以修改/添加/删除:
listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed|
答案 1 :(得分:11)
还有guard:
Guard通过在修改文件或目录时运行自定义规则来自动执行各种任务。
软件开发人员,网页设计人员,编写人员和其他专家经常使用它来避免在更改源文件或配置之后“重新启动”工具等平凡,重复的操作和命令。
常见用例包括:IDE替代品,Web开发工具,设计“智能”和“响应式”构建系统/工作流程,自动执行各种项目任务以及安装/监控各种系统服务......
答案 2 :(得分:9)
还有微小的filewatcher rubygem。 gem没有依赖关系,不包含特定于平台的代码,只是通过轮询来检测更新,删除和添加。
require 'filewatcher'
FileWatcher.new(["directory"]).watch() do |filename, event|
if(event == :changed)
puts "File updated: " + filename
end
if(event == :delete)
puts "File deleted: " + filename
end
if(event == :new)
puts "Added file: " + filename
end
end
答案 3 :(得分:3)
我所知道的三个老派选择:
Ara T. Howard的DirWatch:
我自己的DirectoryWatcher:
Paul Horman的FileSystemWatcher:
答案 4 :(得分:1)
https://github.com/mynyml/watchr
这通常用于自动运行单元测试,但也应该满足您的需求。
答案 5 :(得分:0)
我认为https://github.com/nex3/rb-inotify应该适合你。 使用此gem的示例
require 'rb-inotify'
notifier = INotify::Notifier.new
notifier.watch("/tmp", :moved_to, :create) do |event|
puts "#{event.absolute_name} is now in path /tmp!"
end
notifier.run