Notepad beats them all?

WindowsLockingNotepadFile AccessFile Locking

Windows Problem Overview


On a Windows Server 2012 R2 system, a Kotlin program uses FileChannel.tryLock() to hold an exclusive lock on a file, like this:

val fileRw = RandomAccessFile(file, "rw")
fileRw.channel.tryLock()

With this lock in place, I cannot open the file with:

  • WordPad

  • Notepad++

  • Programmatically with C#, for any value of FileShare:

     using (var fileStream = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
     using (var textReader = new StreamReader(fileStream))
     {
         textReader.ReadToEnd();
     }
    
  • From the command line, the type command:

     C:\some-directory>type file.txt
     The process cannot access the file because another process has locked a portion of the file.
    
  • Internet Explorer (yes, I was desperate)

I can open it with Notepad.

How the heck is Notepad able to open a locked file that nothing else can?

Windows Solutions


Solution 1 - Windows

Notepad reads files by first mapping them into memory, rather than using the "usual" file reading mechanisms presumably used by the other editors you tried. This method allows reading of files even if they have an exclusive range-based locks.

You can achieve the same in C# with something along the lines of:

using (var f = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var m = MemoryMappedFile.CreateFromFile(f, null, 0, MemoryMappedFileAccess.Read, null, HandleInheritability.None, true))
using (var s = m.CreateViewStream(0, 0, MemoryMappedFileAccess.Read))
using (var r = new StreamReader(s))
{
    var l = r.ReadToEnd();
    Console.WriteLine(l);
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMonoThreadedView Question on Stackoverflow
Solution 1 - WindowsIridiumView Answer on Stackoverflow