我怎么能等待写文件?
当我执行此程序时,它运行良好,但validation返回false。 如果我重新执行它,validation工作。
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)
当我打开恢复文件的目录时,文件未完全写入。
在致电validation之前,我打电话给保存,备份和validation。
sleep
不起作用。 该过程完全暂停,不会写入丢失的文件。
您的原始文件大小有多少千兆字节? 我怀疑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
值。
这还没有经过测试,但更多的是我写第一部分:
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?
的很好empty?
查看某些内容是否有内容的方法,如果使用== ''
或!= ''
则更为明显。
使用fullpath[refpath]
会返回一个匹配的字符串或nil
,因此你有一个“truthy / falsey”响应,代码噪音更少。
使用反引号或%x
来获取“diff”的输出,而不是使用带有readlines
popen
。
通常,您的代码看起来像是来自Java。 Ruby具有非常优雅的语法和写作风格,因此可以利用它。