Блокнот бьет их всех?
Некоторые файлы 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);
}