can't flush print when download open-uri

T

T. Onoma

I'm confused. why won't this print? I tried flushing the $defout and $stdout as well as the source_file_io, but that doesn't work either.

# download
prioritized_locations.each do |location|
begin
source_file_io = File.open(self.source_path,'w')
remote_file = open(location)
while incoming = remote_file.read(512)
source_file_io.write(incoming)
# THIS WON'T THIS PRINT!!!!!!!!!!!
print "\ca{source_file_io.pos}KB/#{@source_size}KB"
end
rescue
puts "#{location} failed"
remote_file.close unless remote_file.nil?
source_file_io.close unless source_file_io.nil?
next # try next location
else
puts ' Done.'
break # we got it
ensure
remote_file.close unless remote_file.nil?
source_file_io.close unless source_file_io.nil?
end
end

-t0
 
R

Robert Klemme

Maybe it's because you didn't terminate with "\n".

T. Onoma said:
I'm confused. why won't this print? I tried flushing the $defout and
$stdout as well as the source_file_io, but that doesn't work either.

I'd try $defout.sync=true then you don't need the flushes.
# download
prioritized_locations.each do |location|
begin
source_file_io = File.open(self.source_path,'w')
remote_file = open(location)
while incoming = remote_file.read(512)
source_file_io.write(incoming)
# THIS WON'T THIS PRINT!!!!!!!!!!!
print "\ca{source_file_io.pos}KB/#{@source_size}KB"

did you mean

print "#{source_file_io.pos}KB/#{@source_size}KB\n"

?
end
rescue
puts "#{location} failed"
remote_file.close unless remote_file.nil?
source_file_io.close unless source_file_io.nil?

Closing here is superfluous since "ensure" takes care of that.
next # try next location

superfluous as well.
else
puts ' Done.'
break # we got it

superfluous as well.
ensure
remote_file.close unless remote_file.nil?
source_file_io.close unless source_file_io.nil?
end
end

In the end we get much cleaner code:

require 'open-uri'

# download
$defout.sync = true

prioritized_locations.each do |location|
begin
File.open(self.source_path,'w') do |source_file_io|
open(location) do |remote_file|
while incoming = remote_file.read(512)
source_file_io.write(incoming)
print "#{source_file_io.pos}KB/#{@source_size}KB "
end
end
end
rescue => e
$stderr.puts "#{location} failed: #{e}"
else
puts 'Done.'
end
end

This works for me - and does print.

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,175
Latest member
Vinay Kumar_ Nevatia
Top