在ruby中观看目录

我们有一个应用程序需要处理丢弃到目录中的传入文件。 我正在寻找最好的方法来做到这一点。

我们一直在使用循环的Backgroundrb过程,但是,说实话,Backgroundrb是不可靠的,如果可能的话,我们想要远离它。

Delayed_job似乎不是用于正在进行的任务,而是用于一次性。

我发现DirectoryWatcher http://codeforpeople.rubyforge.org/directory_watcher/看起来很有前景,但理想情况下我们希望对此有一些控制权,并且能够监控它是否已启动。

所以要求是:

  • 永远奔跑
  • 按顺序处理文件
  • 是可以监视的
  • 有某种方式重新启动它并确保它已经启动(上帝?)

谢谢你的任何输入! 这应该不难,我很惊讶我找不到别人在网上谈论这个,因为我认为在商业应用中这并不罕见。

而且还有警卫 :

Guard通过在修改文件或目录时运行自定义规则来自动执行各种任务。

软件开发人员,网页设计人员,编写人员和其他专家经常使用它来避免平凡,重复的操作和命令,例如在更改源文件或配置后“重新启动”工具。

常见用例包括:IDE替换,Web开发工具,设计“智能”和“响应”构建系统/工作流程,自动执行各种项目任务以及安装/监视各种系统服务……

谢谢@emerge ,作为rails的相对新手,我想在我的Rails应用程序中查看文件,而不是从命令行查看。 与此处的其他选项相比,发现Listen是一个非常简单的2个步骤:

  1. 将此添加到gem文件中:

    gem 'listen', '~> 2.0' 
  2. 然后在Application.rb中添加它以在app启动时执行:

     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| 

还有一个微小的filewatcher ruby​​gem。 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 

我知道的三个老派选择:

Ara T. Howard的DirWatch:

  • 文档: http : //codeforpeople.com/lib/ruby/dirwatch/dirwatch-0.9.0/README
  • 下载: http : //codeforpeople.com/lib/ruby/dirwatch/dirwatch-0.9.0.tgz

我自己的DirectoryWatcher:

  • 文档: http : //phrogz.net/RubyLibs/rdoc/files/DirectoryWatcher_rb.html
  • 下载: http : //phrogz.net/RubyLibs/DirectoryWatcher.rb

Paul Horman的FileSystemWatcher:

  • 文档: http : //paulhorman.com/filesystemwatcher/
  • 下载: http : //paulhorman.com/filesystemwatcher/FileSystemWatcher.1.0.0.zip

https://github.com/mynyml/watchr

这通常用于自动运行unit testing,但也应该满足您的需求。

我认为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 
Interesting Posts