Question

Je veux écrire des statistiques dans un fichier texte chaque fois qu'une personne charge une page. Mais de temps en temps, j'arrive au type d'erreur «Impossible d'ouvrir le fichier, déjà utilisé». Je ne peux pas reproduire à 100% cette erreur, c'est très erratique. Mon code est

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month

    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim objStreamWriter As StreamWriter
    objStreamWriter = File.AppendText(FILENAME)
    objStreamWriter.WriteLine(ad_id & ";" & ad_date)
    objStreamWriter.Close()
End Sub

Ma question est la suivante: comment puis-je verrouiller et déverrouiller le fichier afin d’arrêter d’obtenir les erreurs erratiques?

Merci

Était-ce utile?

La solution

Vous devrez gérer l'exception et en créer une pour réessayer d'écrire dans le fichier après un court intervalle aléatoire.

Si vous avez trop de conflits, il serait peut-être plus judicieux de le consigner dans une table d'une base de données et de créer un processus à exporter dans un fichier (si nécessaire)

Autres conseils

Si au moins deux demandes arrivent sur votre serveur Web à peu près au même moment, elles essaieront toutes d'ouvrir le même fichier. Vous devrez créer des noms de fichier uniques pour chaque demande.

Public Sub WriteStats(ByVal ad_id As Integer)
    Dim ad_date As String = Now.Year & Now.Month
    Dim FILENAME As String = Server.MapPath("text/BoxedAds.txt")
    Dim index As Integer

    Using fs As New IO.FileStream(FILENAME, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.ReadWrite), _
          tl As New TextWriterTraceListener(fs)

        index = Trace.Listeners.Add(tl)
        Trace.WriteLine(ad_id & ";" & ad_date)
        Trace.Listeners(index).Flush()
        Trace.Flush()
    End Using
    Trace.Listeners.RemoveAt(index)
End Sub

Trois choses importantes ici:

  1. Utilisation de IO.FileShare.ReadWrite pour autoriser plusieurs auteurs à la fois sur le fichier.
  2. L'instruction Using pour vous assurer que le flux est fermé immédiatement, même si une exception se produit. Cela minimisera les collisions
  3. TextWriterTraceListener créera un fichier temporaire s'il ne peut pas ouvrir le fichier demandé, afin de s'assurer que le message n'est pas perdu.

Je n'ai eu aucun problème avec les infos courtes en utilisant: File.AppendAllText (path, info);

En ce qui concerne le commentaire provoquant des verrouillages, réflecteur utilise les mêmes options expliquées très bien par Joel. Il n'utilise pas le programme d'écriture de trace. Il ne sera donc pas transféré dans un fichier temporaire en cas de charge élevée / de contenu volumineux posant problème.

Si les informations sont volumineuses, vous voulez vraiment des fichiers séparés. Pour une charge importante, je voudrais suivre la suggestion de Joel et créer un fichier temporaire, ce qui peut également être fait en saisissant l'exception dans File.AppendAllText et en utilisant le même File.AppeandAllText avec un nom de fichier unique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top