[VB.NET] Comment être sûr qu'un fichier est écrit avant sa lecture par un autre

Résolu
Signaler
Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009
-
Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009
-
Comment puis-je coder mon application vb.net afin qu'elle attende à un certain point de son exécution, que tous les fichiers textes qu'elle écrit, soient complètement écrits sur le disque avant de continuer. Ces fichiers textes servent d'espaces d'échange de données entre mon application et une autre dont je n'ai pas accès au code source.

Le problème est que l'écriture de fichiers sur le disque est quelque chose d'asynchrone, j'avais penser aux fonctions synchronize et lock des streamwriters, mais sans succès (ou alors je les ai mal utilisées).

Si vous avez déjà été confronté à ce problème ou que vous avez la moindre idée, je vous en serai très reconnaissant. Merci d'avance.

9 réponses

Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009

avec la propriété autoflush des streamwriters et ce qui est mis précédemment, on dirait que tout fonctionne parfaitement.
3
Messages postés
14850
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 janvier 2022
160
Bonjour

Tu peux utiliser la méthode Flush, il me semble.

Il est plus facile de batiser kk1 que de la convertir. (surtout en programmation)
Une question se pose sur le forum, pas en privé
NHenry (VB6, VBA excel, VB.NET, C++, C#.Net)
0
Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009

Le prototype d'une procédure ou d'une fonction d'écriture d'un fichier texte est la suivante :

Dim OutputFile
As
New System.IO.FileStream("c:\mon_fichier.txt", FileMode.OpenOrCreate, FileAccess.Write)



Dim OutputLine
As
New StreamWriter(OutputFile)


...

le reste du prog
...

OutputLine.Flush()


OutputLine.Close()

Le flush et le close se placent en fin de programme et servent à libérer les ressources mais cela n'empêche pas à une application extérieure de lire le fichier.
Je suis en train d'essayer avec ça :


Dim OutputFile
As
New System.IO.FileStream(path1, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)

avec fileshare sur none, le fichier ne devrait pas être partagé.


Le seul problème est de savoir comment faire pour que vb.net attende que ce fichier est bien complètement écrit avant de redonner la main à mon autre programme ?


0
Messages postés
553
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
2 octobre 2016
1
voila un petit exemple de ma penser :)

Dim Ecrire As New StreamWriter("c:\MonFicher2005.txt")
Dim compteur As Integer = 0
Ecrire.WriteLine("Ligne1")

Try
Dim Lecture As New StreamReader("c:\MonFicher2005.txt")
Catch ex As IOException
Do While ex.Message <> ""
compteur += 1
If compteur > 50000 Then
Console.WriteLine("Fichier toujours utilisé")
Exit Do
End If
Loop
End Try

' lecture.Close()

http://www.troxsa.info/
Code Vb.net
0
Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009

Désolé mais je ne peux pas mettre de conditions sur le fichier lorsqu'il est lu.

Je sais qu'il y a moyen de locker un fichier avec le system.IO.fileshare ou le system.security.permissions.fileIOpermissions, le gros problème est de savoir quand est-ce que ce fichier est complètement écrit par windows (il y a toujours un décalage entre la commande et l'écriture vu que c'est asynchrone) ?

Ce qui serait bien, ce serait de passer en écriture synchrone (ce qui devrait être plus lent) mais je ne vois pas vraiment comment faire...
0
Messages postés
553
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
2 octobre 2016
1
Peut etre que FileSystemWatcher t'aidera :)

http://www.troxsa.info/
Code Vb.net
0
Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009

0
Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009

J'ai utilisé ceci :


Dim newfile As New System.IO.FileStream(AdjustedFile, FileMode.Create, FileAccess.Write, FileShare.None, 0, False)
Dim outline As New StreamWriter(newfile)


A prioris, ça fonctionne mais puis-je affirmer à 100% à 100% que l'écriture est à synchrone et que toute information est bien écrite sur le disque avant mon programme vb.net redonne la main à mon second programme ?
0
Messages postés
43
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
10 septembre 2009

J'ai testé les fileSystemWatcher, comme cela est décrit dans l'aide msdn. Ca voit quand je modifie ou crée un fichier, entre autre, mais seulement quand je le fais à la main. Si un programme crée, modifie ou supprime un fichier, ça ne se voit pas, ou pas comme un événement recevable par un FileSystemWatcher.


0