Блокнот їх усіх б’є?


134

У системі Windows Server 2012 R2 програма Kotlin використовує FileChannel.tryLock()для утримання ексклюзивного блокування у файлі, наприклад:

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

Якщо цей замок на місці, я не можу відкрити файл за допомогою:

  • WordPad
  • Блокнот ++
  • Програмно з 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 (так, я був відчайдушним)

Я можу відкрити його за допомогою блокнота.

Як чорт у Блокноті здатний відкрити заблокований файл, який більше нічого не може?

Відповіді:


202

Блокнот читає файли, спочатку відображаючи їх у пам'ять, а не використовуючи «звичайні» механізми зчитування файлів, імовірно, використовувані іншими редакторами, які ви намагалися. Цей спосіб дозволяє читати файли, навіть якщо вони мають ексклюзивні блокування на основі діапазону.

Ви можете досягти того ж у 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);
}

58
Більш детально підтверджений Реймоном Ченном Майкрософт : Щоб завантажити файл, Блокнот відображає подання файлу у вигляді файлу з картою пам'яті і використовує його як джерело. Код з'ясовує кодування, при необхідності виконує перетворення кодової сторінки в UTF-16LE, додає результат у блок пам'яті, а потім використовує повідомлення EM_SETHANDLE для передачі всього цього блоку до елемента редагування.
Стевойасяк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.