I have a method that takes FileStream
as input. This method is running inside a for loop.
private void UploadFile(FileStream fileStream)
{
var stream = GetFileStream();
// do things with stream
}
I have another method which creates and returns the FileStream
:
private FileStream GetFileStream()
{
using(FileStream fileStream = File.Open(myFile, FileMode.Open))
{
//Do something
return fileStream;
}
}
Now the first method throws an ObjectDisposedException
when I try to access the returned FileStream
, probably because it is already closed since I am using using
to properly dispose the stream.
If I don't use using
and instead use it as follows, then the FileStream
remains open and the next iteration of the loop (operating on the same file) throws an exception telling the file is already in use:
private FileStream GetFileStream()
{
FileStream fileStream = File.Open(myFile, FileMode.Open);
//Do something
return fileStream;
}
If I use a try-finally block, where I close the stream in the finally
then it also throws the ObjectDisposedException
.
How can I effectively return FileStream
and close it?
When you return an IDisposable
from a method, you are relegating the responsibility of disposing it to your caller. Thus, you need to declare your using
block around the entire usage of the stream, which in your case presumably spans the UploadFile
call.
using (var s = GetFileStream())
UploadFile(s);