[R] Checking on closed file connections
Duncan Murdoch
murdoch at stats.uwo.ca
Wed Jul 22 02:20:06 CEST 2009
On 21/07/2009 8:13 PM, Jim Nemesh wrote:
> On Jul 21, 2009, at 6:40 PM, Duncan Murdoch wrote:
>
>> On 21/07/2009 5:03 PM, Jim Nemesh wrote:
>>> Hi! I'm wondering if there's a smart way around this:
>>> fileName= (some valid file on your system)
>>>> fileCon=file(fileName, open="rt")
>>>> l<-readLines (fileCon, n= 1)
>>>>
>>>> isOpen(fileCon)
>>> [1] TRUE
>>>> close(fileCon)
>>>> isOpen(fileCon)
>>> Error in isOpen(fileCon) : invalid connection
>>> How do you test for a file being closed if isOpen gives you an
>>> error message?
>> You could use try().
>>
>> But you shouldn't be doing that. Whoever opens the connection
>> should close it. The isOpen() test is designed to be used on newly
>> created connections, being passed to some other function and
>> guaranteed to be valid. Was it created with file(fileName,
>> open="rt") or file(fileName)? That's what isOpen() is there to
>> determine. (The first one was opened, and should be closed by
>> whoever opened it; the second one was not, and the function that
>> uses it shouldn't leave it open.)
>>
>> Duncan Murdoch
>>
>
> The story is of course slightly more complicated. I'm writing a
> streaming caching file input class. When you instantiate the class,
> you open a connection (as shown in the sample code.) I wanted to
> close the file input when either a) I run out of lines in the file b)
> when the class is garbage collected. There's something fishy going on
> with the connection, as it always claims to be invalid when I try to
> close it, yet it reads data out perfectly fine.
>
> Essentially, I'm always getting warnings about not closing the file,
> but I can't close the file!
>
> Some paired down "real world" code (using R.oo Library)
I don't have anything against R.oo, but I really don't know it at all.
So you're on your own with this one.
Duncan Murdoch
>
> setConstructorS3("StreamingFileReader", function(fileName) {
> if (missing (fileName)) fileName =NA
> extend(Object(), "StreamingFileReader",
> .fileName=fileName,
> .fileCon=NA,
> .initialized=F)
> })
>
> setMethodS3("init", "StreamingFileReader", function(this, ...){
> if (this$.initialized==F) {
> this$.fileCon=file(this$.fileName, open="rt")
> #read header
> if (this$.hasHeader) {
> l<-readLines (this$.fileCon, n= 1)
> l<-strsplit (l, '\t')[[1]]
> this$.header=l
> }
> this$.initialized=T
> }
> })
>
> setMethodS3("getHeader", "StreamingFileReader", function(this,
> numLines=1, ...) {
> this$init()
> return (this$.header);
> })
>
> #lots of attempts to remove, cleanup, etc the connection I'm holding
> on to.
> setMethodS3("finalize", "StreamingFileReader", function(this, ...) {
> #if (this$.hasMoreData==F) return()
> #if (is.na(this$.fileCon)) return()
> #rm (this$.fileCon)
> #print (isOpen(this$.fileCon))
> #close(this$.fileCon)
> #close(this$.fileCon)
> })
More information about the R-help
mailing list