[R] Déplacement de données

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

[R] Déplacement de données

#1

Message 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.
Modifié en dernier par Julien le lun. 29 juin 2009 07:52, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11823
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#2

Message 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.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#3

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11823
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#4

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#5

Message 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.
Modifié en dernier par orax le mar. 23 juin 2009 21:50, modifié 1 fois.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

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

#6

Message 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.
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

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

#7

Message par Julien »

Le FileGetAttrib me retourne un fichier pour la majoritée de mes dossiers.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#8

Message par orax »

Rectification :

Code : Tout sélectionner

If StringInStr(FileGetAttrib($ar_Array[$i]), "D") Then ; si c'est un dossier
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11823
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#9

Message 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
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Julien
Niveau 5
Niveau 5
Messages : 141
Enregistré le : sam. 02 août 2008 17:01
Status : Hors ligne

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

#10

Message par Julien »

Après quelques test hier cela fonctionne bien. Merci pour vos réponses.
Répondre