2009-03-12 9 views
3

Je souhaite écrire des statistiques dans un fichier texte chaque fois qu'une personne charge une page. Mais de temps en temps, j'obtiens le 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 estProblème d'ouverture/écriture dans un fichier texte dans ASP.NET

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, comment puis-je verrouiller et déverrouiller le fichier si je cesse d'obtenir les erreurs erratiques?

Merci

Répondre

1

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

Si vous avez trop affirmation alors il serait plus logique de se connecter à une table dans une base de données et créer un processus d'exporter vers un fichier (si elle encore besoin)

+0

J'ai parfois besoin d'écrire dans le fichier jusqu'à 20 fois par page quelle serait la taille d'une contrainte sur une base de données? – pixeldev

4

Si deux ou plusieurs requêtes ont frappé votre serveur Web à peu près en même temps, ils vont tous essayer d'ouvrir le même fichier. Vous devrez créer des noms de fichiers uniques pour chaque requête.

+0

En fait: chaque session est probablement assez bonne. Il est peu probable qu'un seul utilisateur puisse créer autant de requêtes simultanées. –

0

Je n'ai pas eu problème avec des informations courtes en utilisant: File.AppendAllText (chemin, info);

En ce qui concerne le commentaire provoquant des verrous, du réflecteur il utilise les mêmes options expliquées très bien par Joel. Il n'utilise pas le programme de trace, il ne sera donc pas envoyé dans un fichier temporaire dans le cas d'un contenu important/élevé causant des problèmes.

Si l'information est volumineuse, vous voulez vraiment des fichiers séparés. Pour une charge élevée, je voudrais aller avec la suggestion de Joel et créer un fichier temporaire, qui peut être alternativement fait en attrapant l'exception sur File.AppendAllText, et en utilisant le même fichier File.AppeandAllText avec un nom de fichier unique.

+0

Il peut encore verrouiller: je l'ai vu. –

+0

êtes-vous sûr, c'est sur la production et pas une seule entrée de journal pour cela ... comme je l'ai dit, petits morceaux d'info – eglasius

+0

@Joel J'ai confirmé qu'il utilise les options appropriées avec réflecteur, voulez-vous dire que votre solution verrouille également? (ne pense pas, comme je l'ai dit pas d'entrées de journal sur la production) – eglasius

4
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 permettre aux écrivains multiples sur le fichier à la fois.
  2. L'instruction Using pour s'assurer que le flux est immédiatement fermé, même si une exception se produit. Cela réduira au minimum les collisions
  3. Le TextWriterTraceListener créera un fichier temporaire pour votre s'il ne peut pas ouvrir le fichier que vous demandez, pour vous assurer que le message n'est pas perdu.
+0

Joel, pas besoin d'aller avec une solution personnalisée quand le simple File.AppendAllText fait exactement cela (vérifier avec réflecteur) – eglasius

+0

Je vais devoir faire cela, mais comme je l'ai dit ci-dessus: J'ai vu File.AppendAllText se verrouiller. –

+0

Ensuite, votre solution aussi, je suppose que nous avons besoin d'une solution alternative alors/ma prise est que ce n'était pas petit d'info qui donnera des problèmes avec la charge quelle que soit l'approche – eglasius

Questions connexes