在Windows Server 2012 R2系统上,Kotlin程序使用 FileChannel.tryLock()
来保留文件的排他锁,如下所示:
val fileRw = RandomAccessFile(file, "rw")
fileRw.channel.tryLock()
锁定后,我无法使用以下方式打开文件:
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.
我可以用记事本打开它。
记事本如何能够打开其他没有其他功能的锁定文件?
最佳答案
记事本通过首先将文件映射到内存中来读取文件,而不是使用您尝试使用的其他编辑器可能使用的“常规”文件读取机制。即使文件具有基于范围的排他锁,此方法也可以读取文件。
您可以通过以下方式在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/