Code d'erreur -48 sur FTP_Receive

Bonjour à tous,

J’ai un bout de code qui se connecte à un FTP, parcourt le dossier distant, télécharge les fichiers qu’il trouve puis les supprime du FTP.

C’est un code générique qui est appelé quasiment en boucle sur une centaine de FTP et tout se passe généralement bien. Mais parfois, le FTP_Receive échoue et j’ai un code d’erreur -48 qui, si je ne me trompe pas correspond à “Tentative d’utilisation du nom d’un fichier déjà supprimé pour renommer un fichier”.

Le problème c’est que je ne comprends pas du tout ce que signifie cette erreur, et ne sait donc comment la résoudre.
Si un fichier a déjà été supprimé, pourquoi est-ce que je ne pourrais pas réutiliser son nom ?

Si vous avez des pistes, je prends. :smiley:
Et si jamais, voici le code en question :

<code 4D>
$eCode_erreur:=FTP_Login ($txtServeur_FTP;$txtUser_FTP;$txtMDP_FTP;$eSession_FTP;" ")

Si ($eCode_erreur=0)

  //Récupération et parcours du contenu du dossier distant
$eCode_erreur:=FTP_GetDirList ($eSession_FTP;$txtChemin_dossier_distant;$tabNoms_fichiers_distants;$tabTaille_fichiers_distants;$tabTypes_fichiers_distants;$tabDates_fichiers_distants;$tabHeures_fichiers_distants)

Boucle ($i;1;Taille tableau($tabNoms_fichiers_distants))
	
	$txtNom_fichier_distant:=$tabNoms_fichiers_distants{$i}
	$eLongueur_nom_fichier:=Longueur($txtNom_fichier_distant)
	
	  //FTP_GetDirList va aussi nous envoyer les liens du genre "." et "..", donc on les ignore. On ignore aussi tout ce qui n'est pas un fichier.
	Si (($eLongueur_nom_fichier>3) & ($tabTypes_fichiers_distants{$i}=0))
					
		  //Si le nom du fichier contient un caractère non accepté par Windows, le fichier ne sera pas téléchargé
		$txtNom_fichier_local:=Chaine_format_fichier ($txtNom_fichier_local)
		
		$eCode_erreur:=FTP_Receive ($eSession_FTP;$txtChemin_dossier_distant+$txtNom_fichier_distant;$txtChemin_dossier_reception+$txtNom_fichier_local;0)
		
		  //La récupération a réussi, on retire le fichier du FTP
		Si ($eCode_erreur=0)
			FTP_Delete ($eSession_FTP;$txtNom_fichier_distant)
		Sinon   
			ALERTE ("Echec du téléchargement : "+Chaine($eCode_erreur))
		Fin de si 
		
	Fin de si 
	
Fin de boucle 

FTP_Logout ($eSession_FTP)

fin de si
</code 4D>

Bonjour David,
je ne vois pas trop, du coup dans ce genre de cas je tenterais de diviser (pour régner si possible). Là, ça reviendrait à faire en 2 temps :
1/ je récupère en local, à chaque fois que ça marche je le “note” avec AJOUTER A TABLEAU
2/ je supprime du ftp tout ce que j’ai récupéré dans mon tableau
Je ne sais pas si c’est propre à un des FTP que j’utilise, mais j’ai dû pas mal batailler ; du genre ça se déconnecte en cours de route sans raison, faut se re loguer, savoir où c’en était pour reprendre, un vrai bonheur…

Sinon, pour que ce soit plus facile à gérer, tu as intérêt à organiser ton code un peu différemment. Il te faut une méthode de détection d’erreur IC “systématique” dont la doc donne un exemple avec https://doc.4d.com/4Dv18/4D/18/IT-ErrorText.301-4689733.fr.htmlVérifErreur>. J’utilise pour ma part un code qui en dérive :
<code 4D>
//IC_errorGet (error_l {;complément_t) -> txt
//gestion erreur Internet Commands
//$0 chaine non vide si $1 différent de zéro qui explicite l’erreur rencontrée
//Exemple d’emploi:
// $error_t:=IC_getError (FTP_MakeDir ($stream_l;$dir_t);"FTP_MakeDir "+$dir_t)
C_TEXT($0)
C_LONGINT($1)
C_TEXT($2)

C_LONGINT($err_l)
C_LONGINT($params_l)
C_TEXT($compl_t)
C_TEXT($error_t)
//_
$params_l:=Count parameters
$error_t:=""
Case of
: (Not(Asserted($params_l>0;Current method name+" $1 IC error code missing")))
: ($1=0) //pas d’erreur
Else
$err_l:=$1
If ($params_l>1)
$compl_t:=$2
End if
If ($params_l>1)
$error_t:=“IC error “+$compl_t+” - “+String($err_l)+”: “+IT_ErrorText ($err_l)
Else
$error_t:=“IC error “+String($err_l)+”: “+IT_ErrorText ($err_l)
End if
End case
$0:=$error_t
</code 4D>
Ça permet de structurer le code pour ne pas avoir trop d’indentations (et donc plus simple à lire, même si ça n’est pas super élégant) :
<code 4D>
$error_t:=IC_getError (FTP_ChangeDir ($stream_l;$currentDir_t);“FTP_ChangeDir”)
If ($error_t=””) //le répertoire n’existe pas, on le créé
$error_t:=IC_getError (FTP_MakeDir ($stream_l;$currentDir_t);“FTP_MakeDir”)
End if
If ($error_t=””) //sélectionner comme nouveau répertoire courant
$error_t:=IC_getError (FTP_ChangeDir ($stream_l;$currentDir_t);“FTP_ChangeDir”)
End if
//et ainsi de suite…

</code 4D>

Bonjour Arnaud,

Merci beaucoup pour le code et les commandes “IT_”, je connaissais pas du tout et ça m’a été bien utile.
En faisant un IT_ErrorText du code -48, j’ai reçu un message différent que j’ai trouvé dans la doc, et qui me parle bien davantage “A file with this name already exists”.

Me reste à comprendre pourquoi il me dit ça alors que le fichier est supprimé presque immédiatement après son téléchargement, mais me revoilà dans des eaux moins troubles. :smiley:

Encore merci et bonne journée.