c# - remarks - ¿El bloc de notas los supera a todos?



remarks c# (1)

En un sistema Windows Server 2012 R2, un programa Kotlin usa FileChannel.tryLock() para mantener un bloqueo exclusivo en un archivo, como este:

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

Con este bloqueo en su lugar, no puedo abrir el archivo con:

  • WordPad
  • Notepad ++
  • Programáticamente con C #, para cualquier valor de FileShare :

    using (var fileStream = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var textReader = new StreamReader(fileStream))
    {
        textReader.ReadToEnd();
    }
  • Desde la línea de comando, el comando 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 (sí, estaba desesperado)

Puedo abrirlo con el Bloc de notas.

¿Cómo diablos es que el Bloc de notas puede abrir un archivo bloqueado que nada más puede?


El Bloc de notas lee los archivos asignándolos primero a la memoria, en lugar de utilizar los mecanismos de lectura de archivos "habituales" presumiblemente utilizados por los otros editores que probó. Este método permite la lectura de archivos incluso si tienen bloqueos exclusivos basados ​​en rangos.

Puede lograr lo mismo en C # con algo similar a:

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




file-locking