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:
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?
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);
}