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

44,227

Solution 1

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:

Solution 2

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.

Share:
44,227
Vogel612
Author by

Vogel612

Former ♦ Moderator on Code Review Also Room owner for Code Review's "2nd Monitor" Translator and random comment maker for the Rubberduck VBA add-in. I also implemented the RegexAnalysis tool for them :) Feel free to consider all code I provide in Answers on StackExchange licensed under CC0, I would be happy to recieve a "honorable mention" or something, but for the code it's optional.

Updated on July 28, 2021

Comments

  • Vogel612
    Vogel612 almost 3 years

    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?

  • Vogel612
    Vogel612 over 11 years
    the funny thing is, after changing the order, the Page_Load works, but my catch(IOException) BLock still gets executed
  • Hamlet Hakobyan
    Hamlet Hakobyan over 11 years
    Call of Stream.Close in using block is redundant.
  • Adam K Dean
    Adam K Dean over 11 years
    What exception are you getting, the same one? Try commenting out the two Close(); lines as they are probably called by using.
  • Suncat2000
    Suncat2000 over 6 years
    @Matias Regarding your braces comment: "without extra { }" is a personal preference of using the language syntax. A single-statement block doesn't require enclosing braces. And the FileShare.ReadWrite will allow other processes access to the file, but it doesn't solve the problem of the file being left open. Nice example and good points, though.
  • Chris
    Chris almost 5 years
    You can put multiple usings at the same indentation level and have just one set of {}s.
  • Olivier Jacot-Descombes
    Olivier Jacot-Descombes almost 3 years
    Since C# 8.0 you can also use the handy using declaration. using var mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite); using var mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream); // Do your stuff.
  • Matías Fidemraizer
    Matías Fidemraizer almost 3 years
    @OlivierJacot-Descombes Updated! Thanks!