closing files with abrupt interruptions

Discussion in 'Ruby' started by Daniel Brumbaugh Keeney, Feb 15, 2008.

  1. loop do
    File.open somefile, 'r' do |io|
    next
    end
    end

    Does somefile get closed?
    How would I test that?
    I have the same question if it raises an error (that gets rescued) or
    throws a symbol.

    Daniel Brumbaugh Keeney
     
    Daniel Brumbaugh Keeney, Feb 15, 2008
    #1
    1. Advertisements

  2. There are two ways to open a file for reading in ruby, the first is:

    f = File.open("fred.txt", "r")
    f.each do |l|
    puts l
    end
    f.close

    in the above case you have to explicitly close the file, however with this:

    File.open("fred.txt","r") do |f|
    f.each do |l|
    puts l
    end
    end

    The opened file is referenced by the variable f, however f is in the
    scope of the 'File.open() do ... end' and once the program goes past the
    closing 'end' the f will be removed. The deletion of the file handle
    triggers the close. So no need for an explicit close.

    The second way is also more 'rubyish'.
     
    Peter Hickman, Feb 15, 2008
    #2
    1. Advertisements

  3. Yes. See also Peter's explanation.
    Easily:

    [email protected] ~
    $ echo 1 > x

    irb(main):001:0> io = nil
    => nil
    irb(main):002:0> File.open("x") {|io| p io, io.closed?}
    #<File:x>
    false
    => nil
    irb(main):003:0> p io, io.closed?
    #<File:x (closed)>
    true
    => nil
    irb(main):004:0> File.open("x") {|io| p io, io.closed?; raise "E"}
    #<File:x>
    false
    RuntimeError: E
    from (irb):4
    from (irb):4:in `open'
    from (irb):4
    from :0
    irb(main):005:0> p io, io.closed?
    #<File:x (closed)>
    true
    => nil

    Cheers

    robert
     
    Robert Klemme, Feb 15, 2008
    #3
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.