2010-12-10 34 views
0

Je dispose d'un fichier journal qui est ouvert et utilisé par un autre programme, et je l'ai lu son contenu avec les éléments suivants:Écrase le fichier texte utilisé par un autre processus?

Dim strContents As String 
    Dim x As New FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
    Dim objReader As StreamReader 
    objReader = New StreamReader(x) 
    strContents = objReader.ReadToEnd() 
    objReader.Close() 

Cela fonctionne pour lire le texte à partir du fichier alors qu'il est encore en cours d'utilisation par le autre programme, cependant, immédiatement après cela, j'ai besoin de tronquer le fichier texte (sans le supprimer) afin qu'il soit vide à nouveau. Mais le fichier sera toujours utilisé par l'autre programme.

J'ai essayé

Dim sWrite As StreamWriter 
    sWrite = New System.IO.StreamWriter(FullPath, False) 
    sWrite.Write("") 
    sWrite.Close() 

Mais je reçois l'exception "utilisé par une autre application". J'ai essayé de regarder dans StackOverflow et googler, mais je ne peux pas sembler trouver une réponse, et je ne peux pas trouver un moyen de le faire avec filestreams soit, ou je voudrais essayer d'utiliser

Dim fs As New FileStream(FullPath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite) 

Merci à avance.

Répondre

1

Il y a juste quelques autres messages sur ce sujet.

Detecting whether a file is locked by another process (or indeed the same process)

How to check for file lock?

Can I simply 'read' a file that is in use?

La solution semble être:

Try 
'Code to read file if its not locked by another app 
Catch as System.IO.IOException 

Aussi juste un FYI que votre fichier journal est la ressource non gérée de manière la finalisation déterministe aidera à ce problème de contention de ressources. Utilisez l'instruction avec la finalisation déterministe, par exemple:

Using fs = New FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite) 
    fs.SetLength(0) 
    file.Save(fs) 
    fs.Flush() 
End Using 
+0

J'ai un processus planifié qui écrit dans un fichier journal. Si quelqu'un se connecte au serveur et quitte l'explorateur de fichiers, avec ce fichier journal sélectionné, le processus planifié reçoit cette exception et ne peut pas s'exécuter ou ne peut pas écrire dans son fichier journal. Si ennuyant. L'explorateur de fichiers devrait ouvrir le fichier, afficher l'aperçu et le fermer; mais non, il maintient le fichier ouvert tant que le fichier est sélectionné. Je ne peux pas tuer l'explorateur de fichiers du processus planifié, ce qui crée un mauvais problème. – Shavais

0

C'est parce que l'autre programme a un verrou sur le fichier que le système d'exploitation ne vous laissera pas faire ce que vous voulez faire. Sauf si vous changez l'autre programme pour ne pas verrouiller sur écrire.

0

Malheureusement, la solution au problème n'est pas aussi simple que d'ajouter ou de modifier un code de quelques lignes, quelle que soit la langue utilisée. Vous décrivez un exemple classique de resource contention.

Ce type de problème est mieux résolu en utilisant un gestionnaire d'accès, c'est-à-dire un autre processus qui arbitre les écritures de sorte que votre programme n'écrase pas ce que l'autre programme a fait et vice versa.

+0

Le programme qui enregistre uniquement écrit en fait des données toutes les 3-5 minutes, je suis en train d'effacer les données du journal entre ces écritures, il est seulement compliqué par le fait que le programme faisant la journalisation ne libère pas son verrou sur le fichier texte entre les écritures. Je suis d'accord avec le concept que si je l'efface au milieu de l'écriture je finirais avec des données bizarres. –

+0

Avez-vous le contrôle du programme ** other **?Si vous pouvez le modifier de quelque façon * et * garantir la synchronisation entre les deux programmes, faites-le Fermer() le fichier après chaque écriture. –

+0

Négatif, je n'ai aucun contrôle sur l'autre programme. –

0

Je ne sais pas si vous pouvez le faire jusqu'à ce que l'autre processus ferme le flux. Cependant, vous pouvez tuer le processus qui écrit dans le fichier.

Voici un exemple pour cela.

Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("notepad") 

For Each p As Process In pProcess 
    p.Kill() 
Next 

Check this out: http://vbnetsample.blogspot.com/2007/08/start-and-kill-process.html

+0

Cela permettrait d'arrêter l'enregistreur et de vaincre le but, merci cependant. –