记事本打败了他们?

Posted

技术标签:

【中文标题】记事本打败了他们?【英文标题】:Notepad beats them all? 【发布时间】:2018-01-20 13:06:11 【问题描述】:

在 Windows Server 2012 R2 系统上,Kotlin 程序使用FileChannel.tryLock() 对文件持有独占锁,如下所示:

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

有了这个锁,我无法打开文件:

写字板 记事本++

使用 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(是的,我很绝望)

可以用记事本打开它。

记事本怎么能打开其他任何东西都无法打开的锁定文件?

【问题讨论】:

【参考方案1】:

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

您可以在 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);

【讨论】:

由Microsoft’s Raymond Chen 更详细地确认:为了加载文件,记事本将文件的视图映射为内存映射文件并将其用作源。代码计算出编码,必要时执行代码页转换为 UTF-16LE,将结果放入内存块,然后使用 EM_SETHANDLE 消息将整个块交给编辑控件。

以上是关于记事本打败了他们?的主要内容,如果未能解决你的问题,请参考以下文章

Windows不要使用记事本编辑文本文件

第二周:学生作品评论

前段时间记事本内容

从表格视图中的重复文本字段中保存用户输入?

php file_get_contents函数分段读取大记事本或其它文本文件

Process.Responding检测进程退出,同时进程运行