Page 1 sur 1

[FUNC] _FTP_DirCopy()

Posté : mar. 29 nov. 2011 20:56
par PandiPanda
Que permet cette fonction?
Cette fonction permet de copier dans un serveur ftp vos fichier/dossier d'un dossier donné. Cela permet de garder la meme arborescence que vous avez sur votre ordinateur.

Code : Tout sélectionner

#cs _FTP_DirCopy($l_FTPSession, $pathDirToCopy,$s_Remote="/",$sInclude_List = "*",$recurs=False)
    @Param:
        ~ $l_FTPSession => $Conn = _FTP_Connect($Open, $server, $username, $pass)
        ~ $pathDirToCopy => le dossier a copier
        ~ $s_Remote => dans quel dossier copier nos fichier/dossier dans le ftp
        ~ $sInclude_List => accepte seulement des fichier d'un type specifique ?
        ~ $recurs => recherche recursive ou non?
    @Error & @Extend:
        ~ @Error = 0 => pas d'erreur.
        ~ @Error = 1 => erreur de parametre
        ~ @Error = 2 => fichier et/ou dossier mal copié

        ~ @Extend = 0 => pas eu d'erreur pour le ftp (voir si @error = 0)
        ~ @Extend = 1  => pas de dossier trouvé
        ~ @Extend = 2  => pas de fichier trouvé
        ~ @Extend = 4 = => dossier mal copier
        ~ @Extend = 8 => fichier mal copié
    @Return:
        Si erreur => @error=2 alors return un tableau dont $array[0] = le nombre d'element (donc d'erreur)
        Si pas d'erreur => @error=0 alors return "" [RIEN]
#ce
► Afficher le texte
Pour utiliser cette fonction, vous aurez besoin de divers UDF, notamment;

- #Include <FTPEx.au3>
- #include "RecFileListToArray.au3"

Exemple:
► Afficher le texte

Re: [FUNC] _FTP_DirCopy()

Posté : mar. 29 nov. 2011 21:50
par Tlem
Bonsoir PandiPanda.
J'ai survolé votre 'fonction' et je voulais vous faire part de certaines choses qui me dérange.
Je n'ai pas fait le tour complet du code, mais au moins, voici quelques remarques :

1 - Votre manière de tester les paramètres :

Code : Tout sélectionner

    If $pathDirToCopy="" Or Not IsBool($recurs) Or IsInt($s_Remote) Or IsInt($pathDirToCopy) Then
        SetError(1)
Déjà, le test du dossier ! Plutôt que de tester si la chaine est vide, testez plutôt si le dossier existe et si c'est bien un dossier. Et les deux derniers tests me laisse pantois ! :shock: Et pour finir (cette partie), vous fixez @error mais vous ne sortez pas de la fonction ... :shock: :shock:

2 - La gestion des fins de chaine pour $s_Remote et $pathDirToCopy pourait être optimisée, car si par erreur vous avez ceci "\\" ou ceci "//" vous aurez quelques problèmes. :roll:
Je vous conseil ceci :

Code : Tout sélectionner

$pathDirToCopy = StringRegExpReplace($pathDirToCopy, "[\\/]+\z", "")
$s_Remote = StringRegExpReplace($s_Remote, "[\\/]+\z", "")

3 - Ensuite vous utilisez des variables inutilement :

Code : Tout sélectionner

Local $iReturn=2,$iRecur=0,$iSort=0,$iReturnPath=1
If $recurs Then $iRecur=1
Local $_PathArrayFolder=_RecFileListToArray($pathDirToCopy, "*",$iReturn, $iRecur, $iSort, $iReturnPath)
Pourquoi tant de code alors que ceci suffit :

Code : Tout sélectionner

Local $_PathArrayFolder=_RecFileListToArray($pathDirToCopy, "*",2, $recurs, 0, 1)
Idem pour le second _RecFileListToArray. :mrgreen:

4 - Pas de gestion d'erreur si aucun fichier !

5 - Pas de gestion d'erreur sur la copie FTP !

6 - Votre fonction _ReplaceBackSlash() ne présente strictement aucun intérêt puisque dans les deux cas d'appel à cette fonction, la variable ne peut être vide :

Code : Tout sélectionner

_ReplaceBackSlash($s_Remote&"/"&$_PathArrayxxxxx[$i])
Il y aura au moins le "/" central, donc le test

Code : Tout sélectionner

If  $tmp <> "" Then Return $tmp
est inutile ... :mrgreen:
Ce qui permet de simplifier votre code par :

Code : Tout sélectionner

_FTP_DirCreate($l_FTPSession,StringReplace($s_Remote&"/"&$_PathArrayFolder[$i]),"\","/")
Idem pour $_PathArrayFile.

7 - Pensez au code de retour de la fonction, sinon comment savoir si ça s'est bien déroulé (SetExtended ne suffit pas, il faut gérer @error aussi). :roll:

Bon, voilà pour un premier jet, mais je suis presque sur qu'on peut encore trouver des 'erreurs' ou des améliorations.

Re: [FUNC] _FTP_DirCopy()

Posté : mer. 30 nov. 2011 18:42
par PandiPanda
Merci beaucoup, je vais potasser et lire tout ca ^^

Edit:
Edit du code après avoir lu les différentes critique citée plus haut ^^

Meilleur gestion des erreurs, retour d'un tableau d'erreur (c'est à dire le path de(s) fichier(s) et/ou dossier(s)), si erreur y'a eu.

Je suis ouvert à toute autre amélioration, critique ...
ce qui nous tue pas, nous rend plus fort n'est ce pas ? :mrgreen:

Re: [FUNC] _FTP_DirCopy()

Posté : mer. 30 nov. 2011 22:46
par Tlem
Un peut d'air que diable :
► Afficher le texte

Code : Tout sélectionner

If $recurs Then $iRecur=1
me parait totalement inutile car True = 1 et False = 0 !

Pour finir, toujours pas de gestion de @Extented en cas d'erreur de copie de fichier(s) ou dossier(s) !!!

Sinon, le reste à l'air correct, mais je n'ai pas testé. Je suis juste surpris que l'on puisse copier des fichiers dans un sous répertoire de FTP sans avoir besoin de ce déplacer dedans ! :mrgreen:

Re: [FUNC] _FTP_DirCopy()

Posté : jeu. 01 déc. 2011 10:51
par PandiPanda
hanlalala décidemment, je comptais passer par un bitAnd($iRecurs,1) pour savoir si c'etais 1 ou 0, mais finalement c'est inutile :oops:

Merci !! :D

Edit: après test il semblerai que votre fonction _RecFileListToArray() ne prenne pas en compte que le $iRecus=true soit 1, il faut bel et bien passer par un BitAnd($iRecurs,1) pour que ca soit mit à 1 ou 0 :mrgreen:

Edit2: petite mise a jour du code.

Re: [FUNC] _FTP_DirCopy()

Posté : jeu. 01 déc. 2011 17:39
par Tlem
_RecFileListToArray() n'est pas ma fonction, mais celle de Melba23. D'ailleurs pour information, je préfère _FileListToArrayEx() de DXRW4E qui est bien plus simple et aussi efficace. ;)

Pour le code, j'ai pas regardé de prêt, mais ça semble pas mal.