2014-02-07 41 views
1

當我執行這個程序時,它運行良好,但驗證返回錯誤。如果我重新執行它,驗證將起作用。如何等待寫入文件?

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

保存/恢復使用哪些函數來寫入文件? – Taum

+1

我清理你的問題(希望)使其更容易理解。看着你的代碼,我沒有看到任何寫入文件的嘗試。 'IO.popen(「diff -Bb#{diffpath}」)。readlines'可以使用'%x'或反引號更容易地完成。另外,您不需要爲需要的文件使用「.rb」擴展名。如果沒有它,Ruby將自動添加「.rb」擴展名。 –

+0

這可能是相關的:http:// stackoverflow。com/questions/6701103/understanding-ruby-and-os-io-buffering另外,你可能想把你的意見翻譯成英文,因爲不是每個人都在這裏說法語;-) – Taum

回答

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)應該在2秒內從Time.now小心2秒時間分辨率的FAT文件系統。我還使用了abs,因爲有些備份程序會根據他們的需要修改其值。

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獲取「diff」的輸出,而不是使用popenreadlines

通常,您的代碼看起來像來自Java。 Ruby有一個非常優雅的語法和寫作風格,所以要充分利用它。

+0

該文件是創建但無效,我需要的功能保存完成在主程序繼續之前寫入所有文件。 – Quentin