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

Résolu
littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009 - 20 mars 2006 à 08:39
littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009 - 31 mars 2006 à 08:03
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

littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009
31 mars 2006 à 08:03
avec la propriété autoflush des streamwriters et ce qui est mis précédemment, on dirait que tout fonctionne parfaitement.
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
20 mars 2006 à 08:40
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
littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009
20 mars 2006 à 10:26
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
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
20 mars 2006 à 10:49
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009
20 mars 2006 à 11:38
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
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
20 mars 2006 à 11:51
Peut etre que FileSystemWatcher t'aidera :)

http://www.troxsa.info/
Code Vb.net
0
littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009
26 mars 2006 à 18:44
0
littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009
26 mars 2006 à 18:47
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
littlekenny Messages postés 43 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 10 septembre 2009
27 mars 2006 à 14:59
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
Rejoignez-nous