Problème de fermeture de fichier [Résolu]

Messages postés
14
Date d'inscription
mercredi 28 mai 2003
Dernière intervention
1 août 2005
- - Dernière réponse : pondpond
Messages postés
14
Date d'inscription
mercredi 28 mai 2003
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
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
3
Merci
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)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
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)
Messages postés
1858
Date d'inscription
samedi 29 juin 2002
Dernière intervention
17 octobre 2013
0
Merci
Salut
Peux-tu donner le morceau de code concernant ce fichier : ouverture, lecture/écriture, fermeture.
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
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)
Messages postés
1
Date d'inscription
dimanche 14 mars 2004
Dernière intervention
12 décembre 2004
0
Merci
(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
Messages postés
14
Date d'inscription
mercredi 28 mai 2003
Dernière intervention
1 août 2005
0
Merci
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
Messages postés
14
Date d'inscription
mercredi 28 mai 2003
Dernière intervention
1 août 2005
0
Merci
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.