在Ruby中观察Windows上的修改文件

我正在使用Win32-utils gem编写一个Windows服务。 该服务目前正常工作,但其中很大一部分function要求它知道文件何时被修改。 我目前正在做一个包含有关每个文件的数据的大散列,这对于相对较小的目录来说效果很好,但是当在包含〜50000个文件的文件夹上投入使用时,这会消耗大量内存,并且需要很长时间来检查更新。

代码如下所示:

首先运行(设置哈希):

Find.find(@local_base) do |path| # Don't keep any directories in the hash if not FileTest.directory?(path) f = open(path) f.rewind @files[path.gsub(@local_base, "")] = DataFile.new(@local_base, path.gsub(@local_base, ""), Digest::MD5.hexdigest(f.read.gsub("\n", "\r\n")), f.mtime.to_i, @last_checked) end end 

后续运行(检查更新):

 def check_for_updates # can't/shouldn't modified a hash while iterating, so set up temp storage tempHash = Hash.new Find.find(@local_base) do |path| # Ignore directories if not FileTest.directory?(path) File.open(path) do |f| #...and the file is already in the hash... if not @files[path.gsub(@local_base, "")].nil? # If it's been modified since the last scan... if f.mtime.to_i > @last_checked #...and the contents are modified... if @files[path.gsub(@local_base, "")].modified? #...update the hash with the new mtime and checksum @files[path.gsub(@local_base, "")].update end end # mtime check else # If it's a new file stick it in the temporary hash f.rewind tempHash[f.path] = DataFile.new(@local_base, path.gsub(@local_base, ""), Digest::MD5.hexdigest(f.read.gsub("\n", "\r\n")), f.mtime.to_i, @last_scan) end # nil check end # File.open block end # directory check end # Find.find block # If any new files are in the tempHash, add them to @files if not tempHash.empty? tempHash.each do |k, v| @files[k] = v end end # clear tempHash and update registry tempHash = nil update_last_checked end 

有一个更快/更有效的方式来通知我的程序修改后的文件,甚至更好,如果我可以做到这一点,而不recursionsearch整个目录。

Solutions Collecting From Web of "在Ruby中观察Windows上的修改文件"

如果更改日志被修改,您可以将其留给Windows来警告您。 有一个“听”的服务的宝石

查看rstakeout.rb 。 它将递归地观察目录,但是它看起来像检查文件修改标准是不同的。 我不确定大文件集的速度,但也许会给你一些想法。