141 votes

Bloc-notes bat tous les?

Sur un Serveur Windows 2012 R2, un système de Kotlin programme utilise FileChannel.tryLock() à détenir un verrou exclusif sur un fichier, comme ceci:

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

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

  • WordPad
  • Notepad++
  • Par programmation 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, l' type commande:

    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 est le bloc-notes de pouvoir ouvrir un fichier verrouillé que rien d'autre ne peut le faire?

210voto

Iridium Points 7996

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X