在Windows Server 2012 R2系统上,Kotlin程序使用 FileChannel.tryLock() 来保留文件的排他锁,如下所示:

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

锁定后,我无法使用以下方式打开文件:
  • 写字板
  • Notepad++
  • 使用C#以编程方式获取FileShare的任何值:

    using (var fileStream = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var textReader = new StreamReader(fileStream))
    {
        textReader.ReadToEnd();
    }
    
  • 在命令行中, type 命令:

    C:\some-directory>type file.txt
    The process cannot access the file because another process has locked a portion of the file.
    
  • Internet Explorer(是的,我很绝望)

  • 我可以用记事本打开它。

    记事本如何能够打开其他没有其他功能的锁定文件?

    最佳答案

    记事本通过首先将文件映射到内存中来读取文件,而不是使用您尝试使用的其他编辑器可能使用的“常规”文件读取机制。即使文件具有基于范围的排他锁,此方法也可以读取文件。

    您可以通过以下方式在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);
    }
    

    关于windows - 记事本击败了所有人?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45644934/

    10-11 00:34