2017-08-11 10 views
2

Un fichier process.id est verrouillé par un processus sur Windows Server 2012 R2.
Je ne peux pas ouvrir avec:Notepad les bat tous?

  • Wordpad,
  • Notepad ++,
  • programmation en C# en utilisant différentes valeurs de 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" de la commande ligne:

    C:\some-directory> type process.id 
    The process cannot access the file because another process has locked a portion of the file.

  • IE (Oui, j'étais désespéré)



Je peux l'ouvrir avec le Bloc-notes

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

Modifier
Le fichier code de verrouillage est Kotlin/java en utilisant tryLock from FileChannel

val pidFileRw = RandomAccessFile(pidFile, "rw") 
val pidFileLock = pidFileRw.channel.tryLock() 

Fondamentalement, il est demande un verrou exclusif. Mais Notepad l'obtient toujours.

+1

Les mystères de Microsoft, j'ai eu cette erreur plusieurs fois que vous avez dîners chauds. I Utiliser un ensemble d'outils UNIX pour vaincre les protocoles d'autorisation stupides de Microsoft. faites votre choix mais j'utilise cygwin chmod sur un fichier ou récursivement et tout va bien. –

+0

Il s'agit probablement d'un problème d'autorisations avec les attributs du fichier (propriété du groupe/utilisateur, etc.) et ceux du Bloc-notes. Vous pouvez obtenir plus de kilométrage sur Super utilisateur cependant. – informaton

+0

@informaton Je viens de vérifier le fichier est seulement marqué comme 'A'rchive – MonoThreaded

Répondre

4

Le bloc-notes lit les fichiers en les mappant d'abord en mémoire, plutôt que d'utiliser les mécanismes de lecture de fichiers "habituels" probablement utilisés par les autres éditeurs que vous avez essayés. Cette méthode permet la lecture de fichiers même s'ils ont des verrous exclusifs basés sur une plage.

Vous pouvez obtenir le même en C# avec quelque chose le long des lignes de:

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

Très intéressant, va donner un coup de feu et accepter en conséquence. – MonoThreaded

+0

@MonoThreaded Avez-vous eu de la chance avec le code? – Iridium

+0

Yup, fonctionne parfaitement. Merci! – MonoThreaded