web-dev-qa-db-fra.com

Bloc-notes bat tous les?

Sur un système Windows Server 2012 R2, un programme Kotlin utilise FileChannel.tryLock() pour maintenir un verrou exclusif sur un fichier, comme suit:

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

Avec ce verrou en place, je ne peux pas ouvrir le fichier avec:

  • WordPad
  • Bloc-notes ++
  • Par programme avec C #, pour toute valeur de FileShare:

    using (var fileStream = new FileStream(processIdPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var textReader = new StreamReader(fileStream))
    {
        textReader.ReadToEnd();
    }
    
  • À partir de la ligne de commande, la commande 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 (oui, j'étais désespéré)

Je peux l'ouvrir avec le Bloc-notes.

Comment diable le Bloc-notes est-il capable d'ouvrir un fichier verrouillé que rien d'autre ne peut?

128
MonoThreaded

Le Bloc-notes lit les fichiers en les mappant d'abord dans la mémoire, plutôt que d'utiliser les mécanismes de lecture "habituels" supposés utilisés par les autres éditeurs que vous avez essayés. Cette méthode permet la lecture de fichiers même s’ils disposent d’un verrou exclusif basé sur une plage.

Vous pouvez obtenir la même chose en C # avec quelque chose comme:

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