2008-12-02 11 views
1

J'ai une application où j'ouvre un fichier journal pour l'écriture. À un moment donné (pendant que l'application est en cours d'exécution), j'ai ouvert le fichier avec Excel 2003, qui a déclaré que le fichier doit être ouvert en lecture seule. C'est ok pour moi.fichiers en lecture/écriture Serrures

Mais ma demande a lancé cette exception:

System.IO.IOException: Le processus ne peut pas accéder au fichier car un autre processus a verrouillé une partie du fichier.

Je ne comprends pas comment Excel pourrait verrouiller le fichier (auquel mon application accès en écriture), et faire ma demande à ne pas y écrire!

Pourquoi est-ce arrivé?

(Note: Je n'ai pas observé ce comportement avec Excel 2007.)

Répondre

0

Comment écrivez-vous le journal? Avoir votre propre ouvrir/fermer ou utiliser un produit de trente partis?

Je chose que le journal est ouvert et verrouillé seulement quand il écrit quelque chose. Une fois l'écriture de données est terminée, le code ferme le dossier et, bien sûr, libère le verrou

+0

J'ouvre un System.IO.FileStream et je le garde ouvert jusqu'à ce que je finisse de traiter certaines données d'entrée. Dans le cas décrit ci-dessus, le flux était toujours ouvert. –

1

Voici un enregistreur qui prendra soin des verrous de synchronisation. (Vous pouvez modifier pour l'adapter à vos besoins)

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 

namespace Owf.Logger 
{ 
    public class Logger 
    { 
     private static object syncContoller = string.Empty; 
     private static Logger _logger; 
     public static Logger Default 
     { 
      get 
      { 
       if (_logger == null) 
        _logger = new Logger(); 

       return _logger; 
      } 
     } 

     private Dictionary<Guid, DateTime> _starts = new Dictionary<Guid, DateTime>(); 

     private string _fileName = "Log.txt"; 

     public string FileName 
     { 
      get { return _fileName; } 
      set { _fileName = value; } 
     } 

     public Guid LogStart(string mesaage) 
     { 
      lock (syncContoller) 
      { 
       Guid id = Guid.NewGuid(); 

       _starts.Add(id, DateTime.Now); 

       LogMessage(string.Format("0.00\tStart: {0}", mesaage)); 

       return id; 
      } 
     } 

     public void LogEnd(Guid id, string mesaage) 
     { 
      lock (syncContoller) 
      { 
       if (_starts.ContainsKey(id)) 
       { 
        TimeSpan time = (TimeSpan)(DateTime.Now - _starts[id]); 

        LogMessage(string.Format("{1}\tEnd: {0}", mesaage, time.TotalMilliseconds.ToString())); 
       } 
       else 
        throw new ApplicationException("Logger.LogEnd: Key doesn't exisits."); 
      } 
     } 

     public void LogMessage(string message) 
     { 
      lock (syncContoller) 
      { 
       string filePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 

       if (!filePath.EndsWith("\\")) 
        filePath += "\\owf"; 
       else 
        filePath += "owf"; 

       if (!Directory.Exists(filePath)) 
        Directory.CreateDirectory(filePath); 

       filePath += "\\Log.txt"; 

       lock (syncContoller) 
       { 
        using (StreamWriter sw = new StreamWriter(filePath, true)) 
        { 
         sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.sss") + "\t" + message); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Merci, mais ce n'est pas ce que je demandais. J'ouvre un fichier simple pour écrire dessus. Maintenant, quand Excel ouvre le même fichier pour lire mon application ne parvient pas à écrire, parce que * Excel * l'a verrouillé. Je me demande pourquoi. –

0

Je crois que je vais avoir le même type de problème de verrouillage, reproduit comme suit:

  • Utilisateur 1 ouvre le fichier excel2007 à partir du réseau (lire -write) (WindowsServer, version unkn).
  • L'utilisateur 2 ouvre le même fichier Excel (s'ouvre en tant que ReadOnly, bien sûr).
  • utilisateur 1 enregistre avec succès plusieurs fois fichier

À un certain moment, l'utilisateur 1 ne parvient pas à enregistrer le fichier en raison de message « fichier est verrouillé ». Fermez La version ReadOnly de l'utilisateur 2 est libérée, et l'utilisateur 1 peut maintenant enregistrer à nouveau.

Comment pourrait ouvrir le fichier en mode lecture seule mettre un verrou sur ce fichier?

Ainsi, il semble être soit un problème excel2007, ou un problème de serveur.

0

Cela semble être un problème de .NET. (Eh bien, un bug si vous me demandez).

Fondamentalement, j'ai reproduit le problème en utilisant le code multi-thread suivant:

Dim FS As System.IO.FileStream 
    Dim BR As System.IO.BinaryReader 

    Dim FileBuffer(-1) As Byte 

    If System.IO.File.Exists(FileName) Then 
    Try 
    FS = New System.IO.FileStream(FileName, System.IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) 
    BR = New System.IO.BinaryReader(FS) 

    Do While FS.Position < FS.Length 
    FileBuffer = BR.ReadBytes(&H10000) 

    If FileBuffer.Length > 0 Then 
     ... do something with the file here... 
    End If 
    Loop 

    BR.Close() 
    FS.Close() 

    Catch 
    ErrorMessage = "Error(" & Err.Number & ") while reading file:" & Err.Description 
    End Try 

Fondamentalement, le bug est que d'essayer de lire le fichier avec tous les différents modes de partage (LIRE, ECRIRE , READ_WRITE) n'ont absolument aucun effet sur le verrouillage de fichier, peu importe ce que vous essayez; vous finiriez toujours dans le même résultat: Le LOCKED est verrouillé et n'est pas disponible pour un autre utilisateur.

Microsoft n'admettra même pas ce problème.La solution consiste à utiliser les API Kernel32 CreateFile internes pour obtenir l'accès approprié car cela garantirait que l'OS LISTEN à votre demande lors de la demande de lire des fichiers avec un accès verrouillé ou verrouillé.