There have been many times over the years that I’ve been wanting a simple capability of monitoring changes in some directory or some files in my system.

Linux has inotify and Windows has WatchDirectory.

The biggest challenge has been to look for something that works seamlessly across operating systems.

So, I thought of creating my own solution!

And as usual, I looked at Ruby first since that is, by default, on every system I touch!

Although, in my opinion, this program could as well have been written in any language.

The idea I came up with was

  • get modified times of all files (even nested) inside a directory
  • save them as a string to a file
  • compare this every interval

The program eventually turned out looking like this –

prev = File.read('previous_times.txt') rescue ""
watch_directory = File.expand_path(File.join('directory/to/monitor', '**/*'))

mtimes = Dir[watch_directory].collect do |file_name|
  File.mtime file_name if File.file? file_name
end.to_s

puts "=== Have files been modified? ==="
p mtimes != prev

File.write('previous_times.txt', mtimes)

And to run this every 10 seconds, it can be wrapped in a while loop with a sleep.

while true
  ...
  # above code
  ...
  sleep 10
end

As usual, in situations like these, the best test is to check against a node_modules folder. So, I tried it on one which had 9,379,193 files and which took around 75 seconds to scan. And it worked perfectly there too!