记事本比他们都强?

在 WindowsServer2012R2系统上,Kotlin 程序使用 FileChannel.tryLock()来保持文件的独占锁,如下所示:

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

锁定后,我用以下命令打开文件:

  • 写字板
  • 记事本 + +
  • 对于任何值的 FileShare,使用 C # 编程:

    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?

30213 次浏览

记事本通过首先将文件映射到内存来读取文件,而不是使用“通常”的文件读取机制,假设您尝试过的其他编辑器使用了这种机制。此方法允许读取文件,即使它们具有排他的基于范围的锁。

您可以在 C # 中使用以下代码来实现同样的功能:

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