[R] Problème avec fonctions de renommage/fusion de dossiers

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
RomainR
Niveau 1
Niveau 1
Messages : 13
Enregistré le : ven. 25 sept. 2009 11:15
Status : Hors ligne

[R] Problème avec fonctions de renommage/fusion de dossiers

#1

Message par RomainR »

Bonjour à tous,

Voilà j'essaie de créer deux fonctions : je dispose d'un dossier "C:\Folder1" qui contient un grand nombre de fichiers

1/ Ma première fonction RenameFolder à pour but de :
- Renommer le dossier "C:\Folder1" en "C:\TempFolder" (avec tous les fichiers initialement contenus dans "C:\Folder1")
- Recréer un nouveau dossier vide "C:\Folder1"

Par la suite j'utilise d'autres fonctions qui ajoutent des fichiers dans "C:\Folder1" et sur lesquels j'effectue des contrôles quelconques (aucun problème ici)

2/ Ma deuxième fonction MergeFolders à ensuite pour but de :
- Reconstituer mon dossier "C:\Folder1" avec l'ensemble des fichiers additionnels qu'il contient ainsi que ceux contenus dans le dossier "C:\TempFolder"
- Effacer "C:\TempFolder"

Je précise qu'il est très important qu'aucun fichier ne soit perdu dans le process... Voici les deux fonctions que j'utilise actuellement mais il m'arrive frequemment de perdre des fichiers ou alors de rester bloqué dans la fonction MergeFolders...

Voici mes fonctions actuelles :

Code : Tout sélectionner

Func RenameFolder($p_sInitialFolder, $p_sTemporaryFolder)
    Local $lf_sCreateFolderSuceed

    ; Suppression du dossier renommé (au cas où il existe déjà)
    DirRemove($p_sTemporaryFolder, 1)
    Sleep(1000)

    ; Renommage du dossier
    While DirMove($p_sInitialFolder, $p_sTemporaryFolder, 1) = 0
        Sleep(1000)
    WEnd

    ; Création du nouveau répertoire vide
    $lf_sCreateFolderSuceed = DirCreate($p_sInitialFolder)
    Sleep(1000)

    ; Vérifications du bon déroulement de la fonction
    If $lf_sCreateFolderSuceed = 1 Then
        Return True
    Else
        Return False
    EndIf

EndFunc

Func MergeFolders($p_sTemporaryFolder, $p_sMergedFolder)
    Local $lf_sCopyFilesSuceed

    ; Ajout du caractère "\" à la fin du path afin de supprimer la restriction sur le nommage
    If StringRight($p_sTemporaryFolder, 1) <> "\" Then $p_sTemporaryFolder = $p_sTemporaryFolder & "\"
    If StringRight($p_sMergedFolder, 1) <> "\" Then $p_sMergedFolder = $p_sMergedFolder & "\"

    ; Copie des anciens fichiers le dossier temporaire
    $lf_sCopyFilesSuceed = FileCopy($p_sMergedFolder & "*.*", $p_sTemporaryFolder, 9)
    Sleep(2000)

    ; Suppression du dossier existant
    While DirRemove($p_sMergedFolder, 1) = 0
        Sleep(1000)
    WEnd

    ; Renommage du dossier temporaire
    While DirMove($p_sTemporaryFolder, $p_sMergedFolder, 1) = 0
        Sleep(1000)
    WEnd

    ; Vérifications du bon déroulement de la fonction
    If $lf_sCopyFilesSuceed = 1 Then
        Return True
    Else
        Return False
    EndIf

EndFunc
Je précise simplement 2 choses :
- Les boucles while sont utilisées ici car je n'ai pas la moindre idée du temps que mets AutoIT pour copier un grand nombre de fichiers. Or, j'aimerais éviter l'utilisation de Sleep éxagérés !
- Dans la fonction MergeFolders, je fais la copie depuis le dossier original vers le dossier temporaire puis un renommage. La logique voudrait que l'on copie les fichiers du dossier temporaire vers le dossier final puis que l'on efface le temporaire mais j'ai pensé que cette manip permettrait de gagner du temps d’exécution, sachant que le nombre de fichier contenus dans le dossier final sera ridicule à côté du nombre de fichiers contenus dans le dossier temporaire...

Toute aide est fortement appréciée :)

Merci par avance,
Cordialement.
Modifié en dernier par RomainR le lun. 05 sept. 2011 11:30, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Problème avec fonctions de renommage/fusion de doss

#2

Message par Tlem »

La coloration syntaxique du code est réservée aux forums : En ce qui concerne vos fonctions, pouvez-vous nous expliquer ce que vous cherchez à faire exactement, car là elles ne servent à pas grand chose à part consommer des ressources machine et faire tourner le disque dur pour rien !
Je m'explique :
1 - Vous 'déplacez' en le renommant le dossier A en dossier B.
2 - Vous créez un nouveau dossier A.
3 - Vous copiez les fichiers du dossier B vers le nouveau dossier A
4 - Vous supprimez le dossier B

Grosso modo, vous déplacez les fichiers d'un dossier, pour les y remettre un peut plus tard par une opération de copie !!!
Cela n'a pas de sens si l'opération ne prend pas en compte d'autres éléments que vous ne nous avez pas communiqués.
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é".
RomainR
Niveau 1
Niveau 1
Messages : 13
Enregistré le : ven. 25 sept. 2009 11:15
Status : Hors ligne

Re: [..] Problème avec fonctions de renommage/fusion de doss

#3

Message par RomainR »

Bonjour et merci pour votre réponse.

Désolé pour la coloration du code mais je trouvais cela plus lisible ainsi !

En effet je peux comprendre que le but de ces fonctions peut sembler absurde. Mais j'utilise bien entendu d'autres fonctions entre les deux...

Pour résumer, je dispose d'une application qui créé périodiquement des fichiers dans un dossier donné (dossier A)
En paralèlle, j'utilse un autre logiciel qui effectue des contrôles sur tous les fichiers d'un dossier (donc ici mon dossier A)
La problématique est que je ne souhaite vérifier que les fichiers récents, sans quoi le logiciel de contrôle me renverrait des erreurs dûes aux anciens fichiers

L'idée est donc de :
- Créer un dossier temporaire B dans lequel je stocke les anciens fichiers du dossier A puis recréer un dossier A vide => fonction RenameFolder
- Attendre que l'application créé des fichiers dans mon dossier A
- Utiliser mon logiciel de contrôle de fichier sur tous les fichiers du dossier A (qui ne contient par conséquent que des fichiers récents)
- "Reconstituer" mon dossier A avec les fichiers qu'il contient à ce moment (donc tous ceux créés depuis l’exécution de RenameFolder) ainsi que ceux contenus dans mon dossier temporaire B => fonction MergeFolders

Je n'ai pas trouvé d'autre méthode mais je reste ouvert à toute alternative

Bref avec les fonctions ci dessus cela ne fonctionne pas correctement (perte de fichiers et blocage dans la fonction MergeFolders). C'est pourquoi je demande votre aide.

Cordialement,
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Problème avec fonctions de renommage/fusion de doss

#4

Message par Tlem »

Pourquoi ne pas tout simplement faire une copie des fichiers récents dans un dossier temporaire et régler votre logiciel de contrôle en conséquence ?
Je suppose que le nombre de fichiers récents est bien moins important que la liste complète des fichiers.

Encore mieux :
Une autre solution, consisterait à 'ranger' les fichiers plus ancien dans un sous dossier (genre le mois en cours par exemple).
Vous auriez une architecture comme ceci :

Code : Tout sélectionner

- Dossier A     -> Le dossier de vos fichiers d'origine
        201101  -> Janvier 2011
        201102  -> Février 2011
Si votre application de contrôle ne gère pas les sous dossiers, cela permettra de mieux vous y retrouver.
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é".
RomainR
Niveau 1
Niveau 1
Messages : 13
Enregistré le : ven. 25 sept. 2009 11:15
Status : Hors ligne

Re: [..] Problème avec fonctions de renommage/fusion de doss

#5

Message par RomainR »

Merci encore pour votre aide.

En voulant rester concis et ne pas me plonger dans des détails qui pourraient s'avérer inutiles, j'ai en fait omis de préciser certaines contraites :
- Le logiciel de contrôle pointe nécessairement sur le dossier A (c'est à dire le dossier où l'application écrit les fichiers)
- Le logiciel de contrôle vérifie aussi tous les fichiers contenus dans des sous dossiers du dossier A
Je n'ai malheureusement pas la possibilité de modifier le comportement de ce logiciel de contrôle (qui est très médiocre mais imposé pour être précis)

De plus, il est important que tous les fichiers soient réstitués au niveau de la racine du dossier A et qu'il n'y ait absolument aucune perte (ces fichiers sont ensuite utilisé par d'autres applications pour un post traitement pour ne rien omettre).

Je suis sincèrement désolé de rajouter des contraintes supplémentaires à chaque post mais le contexte n'est vraiment pas facile à synthétiser en une fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Problème avec fonctions de renommage/fusion de doss

#6

Message par Tlem »

Je comprend que vous avez du mal à synthétiser le cheminement complet, mais sans tous les éléments, notre aide ne sera que partielle puisque vos questions et contraintes se font au fur et à mesure.

Afin d'éviter un sujet avec 50 messages de questions/réponses, décrivez la totalité du cheminement et les contraintes liées aux divers logiciels et paramètres. Cela permettra de gagner du temps.
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é".
RomainR
Niveau 1
Niveau 1
Messages : 13
Enregistré le : ven. 25 sept. 2009 11:15
Status : Hors ligne

Re: [R] Problème avec fonctions de renommage/fusion de doss

#7

Message par RomainR »

Désolé de vous avoir perdu dans des détails inutiles ce n'était en fait vraiment pas nécessaire.

Après de plus amples investigation sur mon soucis, il semblerait que j'aie trouvé une solution viable. Le script n'est pas très "robuste" mais cela marche en l'état !

Mon problème provenait en fait de la fonction AutoIT DirRemove. Je ne sais pas pour quelles raisons mais elle ne semble pas fonctionner chez moi : le répértoire ne s'efface pas et la fonction retourne 0... Du coup, j'utilise la fonction FileRecycle qui, avec un script en tout point identique fonctionne à merveille.

Le problème est donc partiellement résolu mais, par curiosité, j'aimerais comprendre pourquoi FileRecycle fonctionne mais pas DirRemove.

Voici un mini-script qui fonctionne :
► Afficher le texte
Et un autre qui ne fonctionne pas :
► Afficher le texte
Quelqu'un sait il ce qui ne va pas dans le second ?

Merci par avance.

Cordialement.

EDIT: En fait il se trouve que cela fonctionne aussi avec DirRemove mais à condition de rajouter le paramètre 1 : DirRemove("D:\Test1\", 1) car DirRemove n'agit que sur les répértoires vides par défaut... Cependant il ne marchait pas systématiquement sur mon script (vraisemblablement fichiers ouverts ou en cours de copie...)

Merci pour votre aide.
Répondre