Page 1 sur 1

[R] Déplacement de données

Posté : lun. 22 juin 2009 21:04
par Julien
Bonsoir,

J'ai écrit un petit bout de code qui doit me déplacer des données d'un répertoire à un autre si le dossier existe. Ce script fonctionne bien la première fois mais lors de la seconde exécution (et plus) j'obtiens l'erreur : Error : The requested action with this object has failed

Voici le code :

Code : Tout sélectionner

            ; Déplacements des données %USERNAME%
            $dir_old = $ph1_part_DATA & "Utilisateurs\old_" & $current_user & "\"
            $dir_new = $ph1_part_DATA & "Utilisateurs\" & $current_user & "\"
            $ar_Array = _FileListToArrayEx($dir_old, Default, Default, "", Default)

            If @error = 0 Then
                $dir_total = $ar_Array[0]

                If $dir_total > 0 Then

                    LogFile("[Phase 04 - Etape 01] - Début de : Récuperation des données %USERNAME%")
                    $i = 1
                    While $i <= $dir_total
                        $result = StringRight($ar_Array[$i], 4)
                        $result = StringLeft($result, 1)

                        If $result = "." Then
                            $len = StringLen($ar_Array[$i]) ; Compte le nombre de caractères
                            $cut1 = $len - 23 ; Calcul
                            $line = StringRight($ar_Array[$i], $cut1) ; Coupe en fonction de $cut (en partant de la droite)
                            $line1 = $dir_new & $line ; Résultat
                            FileMove($ar_Array[$i], $line1)
                            Sleep(1000)
                            LogFile("Déplacement du fichier : " & $ar_Array[$i])
                        Else
                            $len = StringLen($ar_Array[$i]) ; Compte le nombre de caractères
                            $cut1 = $len - 23 ; Calcul
                            $line = StringRight($ar_Array[$i], $cut1) ; Coupe en fonction de $cut (en partant de la droite)
                            $line1 = $dir_new & $line ; Résultat
                            DirMove($ar_Array[$i], $line1)
                            Sleep(1000)
                            LogFile("Déplacement du dossier : " & $ar_Array[$i])
                        EndIf
                        $i = $i + 1
                    WEnd
                EndIf
                LogFile("Fin de : Récuperation des données %USERNAME%")
                Sleep(2000)
            EndIf

 
Ce que je n'arrive pas à comprendre c'est pourquoi il fonctionne bien une fois.
Pouvez-vous me venir en aide ? et accessoirement, que pensez-vous de ce code ?

D'avance merci.

Re: [...] Déplacement de données

Posté : lun. 22 juin 2009 22:23
par Tlem
Je ne comprend pas votre ligne N°6 :

Code : Tout sélectionner

If @error = 0 Then
Car d'après la fonction, le fait de tester 0, veut dire que le dossier $dir_old doit être vide et donc d'après mes tests, $dir_total = $ar_Array[0] revient d'après la fonction à dire que $dir_total = 1. :shock:

Je suppose que je me trompe (enfin, je l'espère) car sinon cela ne peut fonctionner normalement...

Sinon, dans votre extrait de script il manque quelques variables et donc il est difficile de tout interprété ou de comprendre.

Si vous pouviez expliquer simplement le but de votre script, cela irait sans doute plus vite.

Re: [...] Déplacement de données

Posté : lun. 22 juin 2009 22:58
par orax
Si j'ai bien compris le principe du fonctionnement du script : il ne peux pas fonctionner correctement puisque les fichiers peuvent ne pas avoir d'extension, ou avoir des extensions de plus de 3 caractères ; quant aux dossiers ils peuvent se terminer par un ".XXX" (comme par exemple : "DOSSIER.001").

@Tlem Je pense qu'il a raison : c'est @error qui est testé à 0 et non $ar_Array[0]. Image

Re: [...] Déplacement de données

Posté : lun. 22 juin 2009 23:28
par Tlem
Ce n'est pas ce que j'ai voulu dire.

Si je reprend le code, cette ligne

Code : Tout sélectionner

$ar_Array = _FileListToArrayEx($dir_old, Default, Default, "", Default)
est sensée lister les dossiers et fichiers du répertoire $dir_old.

Ensuite

Code : Tout sélectionner

If @error = 0 Then
signifie qu'en cas d'échec (pas de dossier et de fichiers), on effectue la suite du code...

Donc effectivement ce code fonctionne une fois car vraisemblablement le dossier est vide la première fois, mais ensuite ce n'est plus le cas. Image

Re: [...] Déplacement de données

Posté : mar. 23 juin 2009 03:22
par orax
Ah d'accord ! en effet, je n'avais pas compris ça comme ça. Image

Pour savoir si vous avez à faire à un dossier ou fichier vous pouvez utiliser FileGetAttrib :

Code : Tout sélectionner

For $i = 1 To $ar_Array[0]
    If StringInStr(FileGetAttrib($ar_Array[$i]), "D") Then ; si c'est un dossier
        DirMove(...
    Else ; sinon, si c'est un fichier
        FileMove(...
    EndIf
    
    Sleep(1)
Next
Il y a aussi la possibilité de copier/déplacer/renommer avec l'API SHFileOperation ; sauf que ça affiche la boîte de dialogue de copie/déplacement/suppression... Il y a un exemple ici : http://www.autoitscript.com/forum/index ... t&p=678910. Il faut ajouter :

Code : Tout sélectionner

Global Const $FO_MOVE = 0x0001
Global Const $FO_COPY = 0x0002
Global Const $FO_DELETE = 0x0003
Global Const $FO_RENAME = 0x0004
...et il faut changer la ligne DllStructSetData($SHFILEOPSTRUCT, "wFunc", $FO_MOVE).
J'ai fait un essai (sur XP) de cette manière : _CopyWithProgress("Z:\TEMP\0\*", "Z:\TEMP\1\") pour déplacer TOUT (sous-dossiers compris) ce que contient le dossier Z:\TEMP\0\.

Concernant l'erreur : "Error : The requested action with this object has failed", je pense qu'elle doit être causée plus loin dans le code puisque je ne vois pas d'objet là.


Edité : problèmes dans le code corrigés.

Re: [...] Déplacement de données

Posté : mar. 23 juin 2009 17:58
par Julien
Bonsoir,

Merci pour vos réponses.

Tlem, pour le :

Code : Tout sélectionner

If @error = 0 Then
Il est indiqué dans le fichier FileListToArrayEx.au3
; Return Value(s): On Success - Returns an array containing the list of files and folders in the specified path
; On Failure - Returns the an empty string "" if no files are found and sets @Error on errors
; @Error or @extended = 1 Path not found or invalid
; @Error or @extended = 2 Invalid $sFilter or Invalid $sExclude
; @Error or @extended = 3 Invalid $iFlag
; @Error or @extended = 4 No File(s) Found
je ne suis pas sur d'avoir compris du coup, je croyais que 4 était retourné si il n'y avait rien à lister. Quoi écrire pour passer à la suite si rien n'est trouvé ?

Merci Orax pour le FileGetAttrib.

Re: [...] Déplacement de données

Posté : mar. 23 juin 2009 18:22
par Julien
Le FileGetAttrib me retourne un fichier pour la majoritée de mes dossiers.

Re: [...] Déplacement de données

Posté : mar. 23 juin 2009 21:48
par orax
Rectification :

Code : Tout sélectionner

If StringInStr(FileGetAttrib($ar_Array[$i]), "D") Then ; si c'est un dossier

Re: [...] Déplacement de données

Posté : mar. 23 juin 2009 22:09
par Tlem
@Julien

Exact dans votre cas.
Sur la version de FileListToArrayEx.au3 que j'avais, @Error est égal à zéro en cas d'échec, et @Extented indique le type d'erreur (1, 2, 3, 4). D'où la confusion.
; Return Value(s): On Success - Returns an array containing the list of files and folders in the specified path
; On Failure - Returns the an empty string "" if no files are found and sets @Error to 0
; @extended = 1 Path not found or invalid
; @extended = 2 Invalid $sFilter or Invalid $sExclude
; @extended = 3 Invalid $iFlag
; @extended = 4 No File(s) Found
Cela dit, j'aurais dut le voir avant puisque je suis intervenu sur la fonction d'origine en signalant son incompatibilité avec les caractères spéciaux.

Mais pour une plus grande clarté du code, je vous conseil de remplacer :

Code : Tout sélectionner

If @error = 0 Then
par

Code : Tout sélectionner

If Not @error Then

Re: [...] Déplacement de données

Posté : lun. 29 juin 2009 07:52
par Julien
Après quelques test hier cela fonctionne bien. Merci pour vos réponses.