【问题标题】:watching a directory in ruby在 ruby​​ 中查看目录
【发布时间】:2011-01-20 12:53:20
【问题描述】:

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

我们一直在使用循环的 Backgroundrb 进程,但老实说 Backgroundrb 是不可靠的,如果可能,我们希望远离它。

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

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

所以要求是:

  • 永远运行
  • 按顺序处理文件
  • 可监控
  • 有某种方法可以重新启动它并确保它启动(上帝?)

感谢您的任何意见!这应该不难,我很惊讶在网络上找不到其他人谈论这个,因为我认为这在商业应用程序中并不少见。

【问题讨论】:

标签: ruby-on-rails ruby filesystemwatcher


【解决方案1】:

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

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

    gem 'listen', '~> 2.0'
    
  2. 然后在 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|

【讨论】:

    【解决方案2】:

    还有guard:

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

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

    常见用例包括:IDE 替代品、Web 开发工具、设计“智能”和“响应式”构建系统/工作流程、自动化各种项目任务以及安装/监控各种系统服务...

    【讨论】:

    • 如果您只需要文件系统通知,那么 Guard 的子项目 listen 可能会提供更细粒度的控制:rubygems.org/gems/listen
    【解决方案3】:

    还有小型文件观察器 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
    

    【讨论】:

    • filewatcher 很好,但如果您通过 SFTP 一次将一组文件全部上传到目录(未检测到某些新文件),则效果不佳。这就是为什么我为此使用rb-inotify
    【解决方案4】:
    【解决方案5】:

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

    【讨论】:

    • 这颗宝石是完美的,经过这么长时间仍然维护
    【解决方案6】:

    https://github.com/mynyml/watchr

    这通常用于自动运行单元测试,但也应该满足您的需求。

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多