Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FileStream.close() does not free file for other processes

I have Following Code in a Page_Load called function. When the Page is loaded the first time after starting Visual Studio, everything works out fine.
But any other opening call to the File after that returns IOException: "File is in use by another process", even when directly opening the File in VisualStudio Solution this Error is returned(of course not as Exception)

FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open);
PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream);
//Do some stuff with the file
mailinglist_FileStream.Close();
mailinglist_Reader.Close();
mailinglist_Reader.Dispose();
mailinglist_FileStream.Dispose();

Why is the file still locked? and why does fully restarting Visual Studio reset the File? when checking file-Properties it says:

Build Action: Content
Copy to output directory: do not Copy

I am only reading this File. can i do something similiar to adLockOptimistic, so that multiple processes can access the File?

like image 534
Vogel612 Avatar asked Feb 19 '13 10:02

Vogel612


People also ask

What does FileStream close () do?

Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream.

What is the difference between FileStream and StreamWriter?

Specifically, a FileStream exists to perform reads and writes to the file system. Most streams are pretty low-level in their usage, and deal with data as bytes. A StreamWriter is a wrapper for a Stream that simplifies using that stream to output plain text.

Do you need to dispose FileStream?

The general rule is to dispose everything that is disposable. In the specific case of a FileStream , you don't need to dispose it to close the file, you only need to use the Close method. You should however dispose of the FileStream object anyway, as it has a finalizer.

Which of the following are functions of the FileStream class?

Use the FileStream class to read from, write to, open, and close files on a file system, and to manipulate other file-related operating system handles, including pipes, standard input, and standard output.


2 Answers

Why is the file still locked? and why does fully restarting Visual Studio reset the File? when checking file-Properties it says [...] I don't know why the file is still locked: probably because your code fails before the stream is closed/disposed.

About "why fully restarting Visual Studio [...]": because you may be using IIS Express or ASP.NET Dev Server whose are closed when you close the IDE, so locks on files are released since the process holding the locks is no longer running.

And about "why is the file still locked?[...]" it could be because the file stream isn't closed because sometimes the thread may not end successfully and the locks aren't released.

As other answer said, check how using block may avoid that IDisposable objects wouldn't be disposed:

// FileShare.ReadWrite will allow other processes 
// to read and write the target file even if other processes 
// are working with the same file
using var mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite);
using var mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream);
      // Do your stuff. Using blocks will call Dispose() for 
      // you even if something goes wrong, as it's equal to a try/finally! 

I am only reading this File. can i do something similiar to adLockOptimistic, so that multiple processes can access the File?

Yes, take a look at File.Open method and FileShare enumeration:

  • File.Open: http://msdn.microsoft.com/en-us/library/y973b725.aspx
  • FileShare enum: http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx
like image 127
Matías Fidemraizer Avatar answered Oct 12 '22 22:10

Matías Fidemraizer


Learn to use using:

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read))
{
    ...
}

The using construct ensures that the file will be closed when you leave the block even if an exception is thrown.

Your problem might not be here, but somewhere else in your code. You'll have to go through all your code and look for places where you have opened files but not put it inside a using statement.

like image 24
शेखर Avatar answered Oct 13 '22 00:10

शेखर