문제

루비를 사용하여 파일을 복사 할 때 파일 복사 작업의 진행 상황 (현재 fileutils.cp를 사용하고 있음)을 표시 할 수 있습니다. verbose 옵션 true 그러나 그것은 단지 발행 된 사본 명령을 보여주는 것 같습니다.

나는 현재 명령 줄 에서이 스크립트를 실행하고 있으므로 이상적으로는 파일을 복사 할 때 SCP와 같은 것을 제시 할 수 있기를 원하지만 진행 상황을 볼 수있는 한 프레젠테이션에 대해 너무 소란스럽지 않습니다. .

도움이 되었습니까?

해결책

답변을 편집하기에 충분한 담당자가 없으므로 여기에 Pisswillis 답변을 기반으로 내 버전이 있습니다. 진행률 바 보석 내 예에서도 사용하고 있습니다. 나는 이것을 테스트했으며 지금까지 잘 작동했지만 약간의 청소와 관련이 있습니다.

require 'rubygems'
require 'progressbar'

in_name     = "src_file.txt"
out_name    = "dest_file.txt"

in_file     = File.new(in_name, "r")
out_file    = File.new(out_name, "w")

in_size     = File.size(in_name)
# Edit: float division.
batch_bytes = ( in_size / 100.0 ).ceil
total       = 0
p_bar       = ProgressBar.new('Copying', 100)

buffer      = in_file.sysread(batch_bytes)
while total < in_size do
 out_file.syswrite(buffer)
 p_bar.inc
 total += batch_bytes
 if (in_size - total) < batch_bytes
   batch_bytes = (in_size - total)
 end
 buffer = in_file.sysread(batch_bytes)
end
p_bar.finish

다른 팁

io.syswrite, io.sysread를 사용하여 직접 굴립니다.

먼저, 진행률 표시 줄 (chars)을 결정합니다. 그러면이 의사 코드를 수행해야합니다 (테스트되지 않음) :

infile = File.new("source", "r")
outfile = File.new("target", "w")

no_of_bytes = infile.length / PROGRESS_BAR_LENGTH

buffer = infile.sysread(no_of_bytes)
while buffer do
 outfile = syswrite(buffer)
 update_progress_bar()
 buffer = infile.sysread(no_of_bytes)
end

여기서 update_progress_bar ()는 한 숯으로 진행 막대를 증가시키는 메소드입니다. 위의 내용은 테스트되지 않았으며 아마도 루비 순수 주의자를 병으로 만들 것입니다. 특히 eofexception은 루프를 엉망으로 만들 수 있습니다. 또한 no_of_bytes가 정수가 아닌 경우 모든 바이트가 작성되도록하는 방법이 필요합니다.

또는 SCP를 사용하기 위해 해킹 할 수 있습니다.

def copy(source, dest)
  `scp #{source} localhost:#{dest}`
end

시스템 호출을 위해 소스와 이름이 올바르게 피해야하는지 확인해야합니다. 그만큼 localhost: 태그는 SCP가 컴퓨터 간과와 같이 파일을 복사하여 진행률 표시 줄을 표시합니다.

Windows에서는 바이너리 파일에 'B'를 추가하는 것을 잊지 않으므로 'W'와 'r'은 이진 파일의 경우 'wb'및 'rb'여야합니다.

in_file     = File.new(in_name, "rb")
out_file    = File.new(out_name, "wb")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top