2010-11-30 27 views
1

Un client a demandé une visionneuse de journaux rapide et incorrecte pour une application ASP.NET, pour laquelle j'utilise log4net, et j'ai pensé que nous pouvions simplement ajouter un contrôleur pour lire la queue du fichier actif et le recracher. Si j'utilise l'API .NET standard (File.OpenText, etc.), j'obtiens une violation d'accès (fichier ouvert par un autre processus), ce qui est ce que j'attends, mais je sais qu'il est possible de lire le fichier parce que Ultraedit l'ouvre pour consultation en lecture seule. Puis-je faire la même chose avec l'API .NET?Protection de l'accès aux fichiers dans Windows pour afficher un fichier journal actif en lecture seule

using(StreamReader infile = 
     System.IO.File.OpenText(Request.PhysicalApplicationPath + @"\log\my.log")) 
{ 
} 
+0

Copie possible de [Comment puis-je lire un fichier même en cas d'exception "en cours d'utilisation par un autre processus"?] (Http://stackoverflow.com/questions/4400517/how-can-i-read-a- file-even-when-get-an-in-use-by-another-process-exception) – Rob

Répondre

5

Précisons que vous autorisez le partage de lecture/écriture sur le fichier, et de mettre un StreamReader sur votre flux pour obtenir comme File.OpenText le même comportement.

using(Stream stream = File.Open(@"x:\path\file.log", 
     FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    using(StreamReader sr = new StreamReader(stream)) 
    { 
     //read content 
    } 
} 

Et puisque vous pouvez ouvrir le fichier avec UltraEdit, je suppose que log4net ne met pas un verrou exclusif sur le fichier.

+0

Mais vous voulez ouvrir le fichier créé par log4net. Comme ultraedit peut le lire, alors le fichier n'est pas sous verrou exclusif par log4net, et vous devriez pouvoir y accéder aussi avec .Net spécifiant le paramètre FileShare. Il se peut également que votre processus asp.net n'ait pas les droits d'accès au fichier réel. –

+0

Eh bien cela a fonctionné, où l'utilisation de base OpenRead ou OpenText n'a pas! – codenheim

+0

"Puisque ultraedit peut le lire, alors le fichier n'est pas sous verrou exclusif" - Bon, j'en savais autant, mais j'ai supposé qu'OpenRead et OpenText utiliseraient des modes d'accès similaires, mais apparemment ils ne le font pas. – codenheim

-2

Avez-vous essayé:

 using (FileStream fs = File.OpenRead("C:\\1.txt")) 
     { 
      //read here 
     }