gpt4 book ai didi

ruby - 在 Ruby 中监视 Windows 上的修改文件

转载 作者:可可西里 更新时间:2023-11-01 09:35:33 24 4
gpt4 key购买 nike

我正在使用 Win32-utils gem 在 ruby​​ 中编写 Windows 服务。该服务目前可以正常工作,但它的大部分功能要求它知道文件何时被修改。我目前正在使用包含每个文件数据的大散列来执行此操作,这对于相对较小的目录非常有用,但是当在包含 ~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

有没有一种更快/更有效的方法来通知我的程序文件已修改,如果我不需要递归搜索整个目录就更好了。

最佳答案

如果 change journal 出现,您可以将其留给 Windows 来警告您 被修改。有一个 gem “监听”服务。

关于ruby - 在 Ruby 中监视 Windows 上的修改文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com