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

pondpond 14 Messages postés mercredi 28 mai 2003Date d'inscription 1 août 2005 Dernière intervention - 11 déc. 2004 à 23:25 - Dernière réponse : pondpond 14 Messages postés mercredi 28 mai 2003Date d'inscription 1 août 2005 Dernière intervention
- 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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 12 déc. 2004 à 13:16
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)

Merci cs_Jack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

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