After having created the directory monitor, I realized that it would not be suitable for everything.
For example, if I needed to know which file was getting modified in the directory, rather than just anything having gotten modified.
Well, in that case we would somehow need to store both the file name and the modified time of the file which changed.
I thought of using some file to store the information in and then read it from there. But instead, I decided to use yaml/store
which is a very interesting library in it’s own right.
require 'yaml/store' watch_directory = File.expand_path(File.join('directory/to/monitor', '**/*')) db = YAML::Store.new('previous_times.yaml') prev = [] db.transaction do prev = db['mtimes'].nil? ? [] : db['mtimes'].collect { |r| r } end mtimes = Dir[watch_directory].collect do |file_path| if File.file? file_path file_name = File.basename file_path { file: file_name, mtime: File.mtime(file_path) } end end if prev != mtimes and !prev.empty? puts " === files modified ===" diff_elements = mtimes - prev diff_elements.each do |r| p r[:file] end end db.transaction do db['mtimes'] = mtimes end
This would give an output like this
=== files modified === file1.txt
And, as usual, to run this every 10 seconds, it can be wrapped in a similar while loop with a sleep.
while true ... # above code ... sleep 10 end