当我执行此程序时,它运行良好,但验证返回false。如果我重新执行它,验证就会起作用。
fullpath
是备份目录,refpath
是原始文件的路径:
if (fullpath.include?(refpath) && refpath.empty? == false && fullpath.empty? == false)
diffpath= "#{fullpath} #{refpath}"
puts diffpath
sortie = IO.popen("diff -Bb #{diffpath}").readlines #(fullpath backup_dir)
#puts fullpath
if sortie.empty?
puts "Les fichiers -#{f} sont identiques."
else
puts "Modification : [#{refpath}] \n [#{fullpath}] "
end
end
主要计划是:
require "modif.rb"
require "testdate.rb"
require "restore_data.rb"
#Pour la sauvegarde des fichiers
puts "__________SAUVEGARDE__________"
#Pour la restauration des fichiers :
puts "__________RESTAURATION__________"
#Vérification de l'intégrité des fichiers restaurés.
puts "__________VERIFICATION__________"
sleep(5.0)
v = Verif.new
v.do_verif(outdir)
当我打开恢复文件的目录时,文件没有完全写入。
在致电验证之前,我致电保存,备份和验证。
sleep
不起作用。该过程完全暂停,不会写入丢失的文件。
答案 0 :(得分:1)
这还没有经过测试,但更多的是我写第一部分:
if ((fullpath != '') && fullpath[refpath] && (refpath != ''))
sortie = `diff -Bb #{ fullpath } #{ refpath }`
if sortie == ''
puts "Les fichiers -#{ f } sont identiques."
else
puts "Modification : [#{ refpath }] \n [#{ fullpath }] "
end
end
通常,您可以简化测试。虽然Ruby使用empty?
方法来查看某些内容是否有内容是很好的,但如果您使用== ''
或!= ''
则更为明显。
使用fullpath[refpath]
会返回匹配的字符串或nil
,因此您的响应会出现“truthy / falsey”,代码噪音会更少。
使用反引号或%x
来获取“差异”的输出,而不是将popen
与readlines
一起使用。
通常,您的代码看起来像是来自Java。 Ruby具有非常优雅的语法和写作风格,因此可以利用它。
答案 1 :(得分:0)
原始文件的大小是多少千兆字节?我怀疑sleep 5.0
是否真的没有意义,根本原因是其他原因。或者您使用慢速USB闪存作为备份目录?
如果您确定需要等待写入过程完成,也许您可以对备份文件的mtime
进行轮询:
finished = false
30.times { # deadline of 30*10 == 300 seconds
if 5 < (File.mtime(fullpath) - Time.now).abs
# the backup process had done its job
finished = true
break
end
sleep 10
}
if finished
v = Verif.new
...
当备份过程正在写入输出文件时,File.mtime(fullpath)
应该在Time.now
的2秒内。小心FAT文件系统,时间分辨率为2秒。我还使用了abs
,因为有些备份程序会根据需要修改mtime
值。