Problème de fermeture de fichier

Résolu
pondpond Messages postés 14 Date d'inscription mercredi 28 mai 2003 Statut Membre Dernière intervention 1 août 2005 - 11 déc. 2004 à 23:25
pondpond Messages postés 14 Date d'inscription mercredi 28 mai 2003 Statut Membre Dernière intervention 1 août 2005 - 12 déc. 2004 à 14:51
Bonjour j'ai un problème sur un transfert de fichier.
Lorsque j'arrive à bout du transfert de fichier, je ne parviens à renomer le fichier reçu. J'obtient l'erreur 55: "fichier déjà ouvert" alors que j'ai auparavent fermé ce fichier avec la fonction close.

J'ai vu sur le forum que l'erreur pouvait être du à des contrôles faisant déjà référence à ce fichier. Mais dans mon cas, je n'en vois pas de tels !

J'en ai conclu que l'erreur venait du fait que Vb ne me ferme pas rellement le fichier. Surtout que quand cette erreur se produit, il est impossible de supprimer le fichier tant que le programme est ouvert et ceci quelque soit le nombre de fois ou la fonction close a été appelée.
N'y aurait-il pas possibilité de forcer sa "libération" ?

Merci

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 déc. 2004 à 13:16
re pondpond
J'ai un peu epluché ton code.
Le problème est que cette Sub est lancée plusieurs fois, à chaque réception de données.
Donc, si tu reçois plusieurs fois le "FIC_____" seul, tu vas aussi ouvrir autant de fois le fichier. Donc Nf2 va s'incrémenter.
Essaye de suivre l'évolution de Nf2 pendant un transfert :
Après le Nf2 = FreeFile, ajoute "Debug.Print Nf2" et suis ce qui se passe dans la fenêtre de debug (Ctrl-G).
Si tu vois plusieurs lignes d'infos, c'est que tu ouvres plusieurs fois le fichier --> comme tu ne refermes que le dernier connu dans le Case "FIC__EOF", il en reste d'ouvert.

Le "On Error Resume Next" masque les erreurs dues à ce bug, car Nf2 est quand même recalculé alors que tu n'ouvriras pas réellement une deuxième fois le fichier.
Avant de faire "fichier_ouvert = True", teste-le pour savoir si tu l'as déjà fait.

Vala
Jack
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 déc. 2004 à 01:42
Salut pondpond
Ton raisonnement est juste, mais un Close ferme réellement le fichier, pas de soucis de ce côté là ('Close #N°' ou 'Close').
La question est : As-tu laissé le temps au système de gérer ses entrées/sorties en insérant un DoEvents après le Close et avant de faire le Name, car si ces actions se suivent immédiatement, les données n'ont pas encore été sauvegardées.
Je ne vois pas d'autres explication.

Vala
Jack
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
cs_rene38 Messages postés 1858 Date d'inscription samedi 29 juin 2002 Statut Membre Dernière intervention 17 octobre 2013 11
12 déc. 2004 à 01:51
Salut
Peux-tu donner le morceau de code concernant ce fichier : ouverture, lecture/écriture, fermeture.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 déc. 2004 à 03:17
Au fait, j'y pense : Le fichier est peut-être ouvert par une autre application ! C'est surement ça !
En ce qui concerne les manip dans un fichier texte --> il y en a plein sur vbfrance.

Vala
Jack
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0

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

Posez votre question
wyzok Messages postés 1 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 12 décembre 2004
12 déc. 2004 à 08:37
(je ne suis pas pondpond, mais j'ai entre aperçu ses problemes l'autre jour et je dois peut etre vous donner des symptomes)

a priori le fichier est envoyé correctement, mais ça plante juste à la fin, donc au moment de créer le vrai fichier sur le disque dur (à partir du tmp)

est-il possible qu'une application autre que le script vb y ait accès et nous bloque son acces ?

merci à tous
0
pondpond Messages postés 14 Date d'inscription mercredi 28 mai 2003 Statut Membre Dernière intervention 1 août 2005
12 déc. 2004 à 12:42
J'ai déjà essayé de mètre un Doevents
Je ne pense pas que le fichier soit ouvcert par une autre application que la mienne, puisque c'est mon programme qui créé ce fichier au début du transfert

Voici le bout de code qui gère les données arrivant sur le socket du recepteur du fichier.
Je pense qu'il est assez classique.

------------------------------------------------------------------------------
Public Sub reçoit_donnée(ByVal donnée As String)
Dim Data As String
Dim i As Integer
Dim num_cour_requette As String

Data = donnée

'Extrait le numéro de la requette
Do
i = i + 1
num_cour_requette = Left(Data, i)
Loop Until Right(Left(Data, i + 1), 1) = "|"

Data = Mid(Data, i + 2)
If Val(num_cour_requette) <= num_requette_rec Then 'si la requette a déjà été reçue alors, on réenvoit le dernier envoit
int_princ.serveur_fich.Item(numéro).SendData dernier_envoit
Exit Sub
End If

'dans le cas contraire, on execute la requette

test.Text = test.Text + vbCrLf + num_cour_requette
test.SelStart = Len(test.Text)
num_requette_rec = Val(num_cour_requette)

Select Case Left(Data, 8)

Case "NOM_EMET"
emeteur = Mid(Data, 9) ' l'emeteur envoit son nom
dernier_envoit = "OK_NOM__\fin_trans/"
int_princ.serveur_fich.Item(numéro).SendData dernier_envoit

Case "FICHIER_" 'l'emmeteur envoit le nom du fifhier qu'il veut envoyer
Fichier = Mid(Data, 9)
dernier_envoit = "OK_FICH_\fin_trans/"
int_princ.serveur_fich.Item(numéro).SendData dernier_envoit


Case "TAILLE__"
taille = Val(Mid(Data, 9)) 'l'emmeteur envoit la taille du fichier qu'il veux envoyer
'Affiche une fenêtre d'information
Set info_form_var = New info_form
info_form_var.Show
info_form_var.info_text.Caption = emeteur + " souhaite vous envoyer un fichier."
info_form_var.numéro_fen = numéro
info_form_var.fenêtre = "reçoit_fichier"
info_form_var.tempo.Enabled = True
'--------------------------------

Case "FIC_____"
If Data = "FIC_____" Then 'si juste "FIC" alors
On Error Resume Next
Nf2 = FreeFile 'il ouvre le fichier pour y insrcire la futur suite qui va arriver
Kill CDial.FileName
fichier_ouvert = True
Open Left(CDial.FileName, Len(CDial.FileName) - 3) + "tmp" For Binary As #Nf2
statut.Text = "Début du transfert"
dernier_envoit = "SUITE___\fin_trans/"
int_princ.serveur_fich.Item(numéro).SendData dernier_envoit 'demande la suite
tempo_vitesse.Enabled = True
Else
Dim ligne As String
ligne = Mid(Data, 9)
nb_octets = nb_octets + Len(ligne) - 1
Put #Nf2, , ligne 'donc inscrit les données
DoEvents
'avancement.Value = nb_octets
dernier_envoit = "SUITE___\fin_trans/"
int_princ.serveur_fich.Item(numéro).SendData dernier_envoit 'puis demande la suite
End If

Case "FIC__EOF" 'c'est la fin du transfert
tempo_vitesse.Enabled = False
Close #Nf2 'ferme le fichier
DoEvents
fichier_ouvert = False
fichier_transféré = True
Name Left(CDial.FileName, Len(CDial.FileName) - 3) + "tmp" As CDial.FileName
dernier_envoit = "OK_FIN__\fin_trans/"
int_princ.serveur_fich.Item(numéro).SendData dernier_envoit
statut.Text = "Le fichier " + Fichier + " a été entièrement reçu."
avancement.Value = avancement.Max

End Select

End Sub

------------------------------------------------------------------------------

Ce que l'on peut faire comme bilan de ce code:
Le fichier est ouvert en mode binaire. Les données sont écrites au fur et à mesure de leur reception par le socket avec la fonction Put. Le fichier est fermé lorsque tout a été reçu, puis renommé avec name. Et c'est cette dernière partie qui souvent défaille à cause d'un fichier pas correctement fermé.

Merci pour votre aide
0
pondpond Messages postés 14 Date d'inscription mercredi 28 mai 2003 Statut Membre Dernière intervention 1 août 2005
12 déc. 2004 à 14:51
J'avais effectivement un problème dans le protocole entre les machine cliente et le serveur.
Certaine fois, le message "FIC____" revennait plusieurs fois. Comme effectivement, le On error resume next boquait l'affichage des erreurs, je n'avais pas appercu que l'origine du problème de fermeture du fichier se trouvait ici !

Merci beauoup pour votre aide

bonne progr
0
Rejoignez-nous