我怎么能等待写文件?

当我执行此程序时,它运行良好,但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具有非常优雅的语法和写作风格,因此可以利用它。