2014-02-07 3 views
1

이 프로그램을 실행하면 제대로 작동하지만 검증 결과는 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

저장/복원을 사용하여 파일을 쓰는 기능은 무엇입니까? – Taum

+1

질문을 정리하여 (이해 되었으면) 더 이해하기 쉽게 만들었습니다. 코드를 보면 파일을 쓰려고하는 시도가 없습니다. 'IO.popen ("diff -Bb # {diffpath}"). readlines는'% x' 또는 backticks를 사용하여 더 쉽게 할 수 있습니다. 또한,'require '파일에 ".rb"확장자를 사용할 필요가 없습니다. 루비는 파일이 없으면 ".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)Time.now에서 2 초 내에 있어야합니다. 2 초의 시간 분해능을 가진 FAT 파일 시스템에주의하십시오. 일부 백업 프로그램은 mtime 값을 원하는대로 변경하기 때문에 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가 반환되므로 코드 노이즈가 적고 "사실/틀림"응답이 표시됩니다.

readlines과 함께 popen을 사용하는 대신 "diff"의 출력을 얻으려면 %x을 사용하십시오.

일반적으로 코드는 자바에서 온 것처럼 보입니다. 루비는 매우 우아한 문법과 글쓰기 스타일을 가지고 있습니다.

+0

파일은 생성되었지만 무효이며 기능이 필요합니다. 저장 완료는 주 프로그램이 계속되기 전에 모든 파일을 기록합니다. – Quentin

관련 문제