
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)

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)
})
	[[alternative HTML version deleted]]


