Блокнот бьет их всех?

Некоторые файлы process.id заблокированы некоторым процессом в Windows Server 2012 R2.
Я не могу открыть его с помощью:

  • Word Pad,
  • Notepad++,
  • программно в С#, используя различные значения FileSharing,

            using (var fileStream = new FileStream( processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            using (var textReader = new StreamReader(fileStream))
            {
                String processIdString = textReader.ReadToEnd();
                node.processId = Convert.ToInt32(processIdString);
            }
    
  • "type" из командной строки:

    C:\some-directory> type process.id
    The process cannot access the file because another process has locked a portion of the file.
  • IE (Да, я был в отчаянии)



Я могу открыть его с помощью Блокнота

Как heck Notepad может открыть заблокированный файл, который больше ничего не может сделать?

редактировать
Код блокировки файла - kotlin/java с помощью tryLock из FileChannel

 val pidFileRw = RandomAccessFile(pidFile, "rw")
 val pidFileLock = pidFileRw.channel.tryLock()

В основном он запрашивает эксклюзивный замок. Но все же Блокнот получает его.

Ответы

Ответ 1

Блокнот читает файлы, сначала сопоставляя их в памяти, а не используя "обычные" механизмы чтения файлов, предположительно используемые другими редакторами, которые вы пытались использовать. Этот метод позволяет читать файлы, даже если у них есть эксклюзивные блокировки на основе диапазона.

Вы можете добиться того же самого в С# с чем-то вроде:

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