我怎么能等待写文件?

时间:2014-02-07 14:29:34

标签: ruby file wait

当我执行此程序时,它运行良好,但验证返回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不起作用。该过程完全暂停,不会写入丢失的文件。

2 个答案:

答案 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来获取“差异”的输出,而不是将popenreadlines一起使用。

通常,您的代码看起来像是来自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值。