FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
gequa
Niveau 1
Niveau 1
Messages : 7
Enregistré le : mar. 20 août 2019 10:52
Status : Hors ligne

FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#1

Message par gequa » mar. 20 août 2019 11:41

Bonjour,
FileOpenDialog permet de sélectionner plusieurs fichiers dans une fenêtre Explorateur de Windows qu'il ouvre et retourne, dans une nouvelle fenêtre, la liste des fichiers sélectionnés.
Question: Existe-t-il une fonction permettant de copier cette liste dans un nouveau dossier ?
Merci

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5869
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#2

Message par mikell » mar. 20 août 2019 13:06

FileOpenDialog quand on sélectionne plusieurs fichiers retourne : "Directory|file1|file2|...".
Donc StringSplit($resultat, "|") et boucle sur l'array obtenue avec des FileCopy
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

gequa
Niveau 1
Niveau 1
Messages : 7
Enregistré le : mar. 20 août 2019 10:52
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#3

Message par gequa » mar. 20 août 2019 21:37

Merci pour cette réponse rapide que mes connaissances ne me permettent pas d'apprécier. Je vais donc continuer à fouiller.

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 701
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#4

Message par walkson » mer. 21 août 2019 00:18

Bonjour,
Je pense que vous souhaitez le chemin complet des fichiers sélectionnés
Explication dans le code
#include <FileConstants.au3>

$hFile = @ScriptDir & "\Dossier\chemin.txt"

$rep = FileOpenDialog("choisir", @DesktopDir,"tout(*.*)", BitOR($FD_MULTISELECT, $FD_PATHMUSTEXIST, $FD_FILEMUSTEXIST))
;multiple selections are "Directory|file1|file2|...".
If Not @error Then ;pas d'annulation
        $hSplit = StringSplit($rep, "|");on découpe à chaque | pour obtenir un array (tableau)
        ;$hSplit[0] première ligne du tableau est le nombre d'éléments dans le tableau
        ;$hSplit[1] deuxième ligne est le dossier
        ;$hSplit[n] les autres lignes sont les fichiers
        Local $text
        For $i = 2 To $hSplit[0] ; on boucle sur l'array, $i est la ligne
                $text &= $hSplit[1] &"\"& $hSplit[$i] & @CRLF ; dans la variable $text, le chemin ($hSplit[1]), puis le fichier, puis retour à la ligne, cumulé à chaque ligne
        Next

        $hFileopen = FileOpen($hFile, $FO_OVERWRITE + $FO_CREATEPATH ); création du chemin et fichiers en overwrite
        FileWrite($hFileopen, $text)
        FileClose($hFileopen)

EndIf
Pour avoir de l'aide, sélectionnez dans Scite un mot (ex: For) et tapez F1
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5869
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#5

Message par mikell » mer. 21 août 2019 06:04

Désolé pour ma réponse excessivement succinte :mrgreen:
J'ai cru comprendre qu'il s'agissait de copier des fichiers dans un autre dossier, donc je me permets de compléter la réponse de walkson
NB : le fichier d'aide est le meilleur ami (AutoIt > Function Reference > File, Directory and Disk Management)

#include <FileConstants.au3>
#Include <Array.au3> ; pour _ArrayDisplay

$rep = FileOpenDialog("choisir", @DesktopDir,"tout(*.*)", BitOR($FD_MULTISELECT, $FD_PATHMUSTEXIST, $FD_FILEMUSTEXIST))
If Not @error Then
        $hSplit = StringSplit($rep, "|")
        ; _ArrayDisplay($hSplit)  ; juste pour visualiser le truc
EndIf

$dossier_dest = @desktopdir & "\dossier\"

For $i = 2 To $hSplit[0]   ; boucle sur l'array
        $file_source = $hSplit[1] & "\" & $hSplit[$i]
        $file_dest = $dossier_dest & $hSplit[$i]   ; on peut (ou pas) garder le même nom de fichier
        FileCopy($file_source, $file_dest, $FC_OVERWRITE + $FC_CREATEPATH)  
Next
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

gequa
Niveau 1
Niveau 1
Messages : 7
Enregistré le : mar. 20 août 2019 10:52
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#6

Message par gequa » mer. 21 août 2019 21:13

Merci Mikell, merci Walkson,
Je vais tenter de décortiquer tout ça ! :)

gequa
Niveau 1
Niveau 1
Messages : 7
Enregistré le : mar. 20 août 2019 10:52
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#7

Message par gequa » mar. 27 août 2019 17:38

Bonjour à tous!
Après de nombreuses heures de bricolage, à assembler des bouts de codes glanés ici et là, j'avais obtenu un résultat qui me satisfaisait. Aujourd'hui, rien ne va plus... Est-ce l'environnement W7 64bits !?
L'objet du script est le suivant :
;Créer un répertoire sur le bureau , C:\Desktop\Repertoire
;Sélectionner des fichiers dans les répertoires de l'arborescence Windows et les copier dans le répertoire créé précédemment.
;Sélectionner tous les fichiers nouvellement collés ("^a") , lancer leur lecture avec l'application Windows par défaut ("{Enter}") en plein écran ("{f11}")
;éventuellement, effacer le contenu du répertoire de lecture précédemment créé, après la lecture de tous les fichiers.

Voici donc le script en question (merci pour votre indulgence!)
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>

$dir = "C:\Desktop\CATALOGUE"    ; Emplacement des fichiers

;$sFilePath = "C:\Desktop\CATALOGUE"

Exemple()
Func Exemple()

;Création d'un répertoire

                        ; Crée une constante de portée Local avec le répertoire.
        Local Const $sFilePath = "C:\Desktop\CATALOGUE"
        Local $iFileExists = FileExists($sFilePath)
                        ; Affiche si le fichier existe ou pas.
        If $iFileExists Then
        MsgBox($MB_SYSTEMMODAL, "", "Le répertoire existe.") ;& @CRLF & "FileExist a retourné: " & $iFileExists)
    Else
        MsgBox($MB_SYSTEMMODAL, "", "Le répertoire n'existe pas.") ;& @CRLF & "FileExist a retourné: " & $iFileExists)
    EndIf
                        ; Crée le répertoire.
        DirCreate($sFilePath)
                        ; Affiche un message sur la création du répertoire.
        MsgBox($mb_systemmodal,"","Le répertoire a été créé.")


;Sélectionner des fichiers dans l'arborescence Windows et les copier dans le répertoire.

                        ; Crée une constante locale avec le message à afficher dans FileOpenDialog.
    Local Const $sMessage = "Appuyez sur Ctrl ou Shift pour choisir plusieurs fichiers."

    Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "Images (*.jpg;*.bmp)| Videos (*.avi;*.mpg)", $FD_FILEMUSTEXIST + $FD_MULTISELECT)

                        ; Vérifiez quel type de retour nous obtenons de la fonction.
If @error Then ; Echec complet
    MsgBox($MB_SYSTEMMODAL, "Erreur", "Echec de la sélection")
Else            ; Vérifiez les retours multiples qui auront des délimiteurs.
    If StringInStr($sFileOpenDialog, "|") Then
                        ;Plusieurs fichiers sélectionnés, il faut donc créer un tableau.
        $aFileSplit = StringSplit($sFileOpenDialog, "|")
                        ; Et puis boucler dans le tableau.
        For $i = 2 To $aFileSplit[0]    ; Note commençant à [2],car [0] est le compte et [1] le chemin.
            ; Vous devez créer le chemin complet à chaque passage.
            FileCopy($aFileSplit[1] & "\" & $aFileSplit[$i], $sFilePath)
                ;Sleep(100)

                Next
                Else
        ; Un seul fichier sélectionné, alors copier immédiatement.
        FileCopy($sFileOpenDialog, $sFilePath)

EndIf

EndIf

WinActivate("CATALOGUE","")
        ;Send("^a")

        ;Send("{ENTER}")
EndFunc
Merci pour votre aide éventuelle ! le script bloque avant l'affichage du catalogue qui est bien créé et rempli des fichiers sélectionnés.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5869
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#8

Message par mikell » mar. 27 août 2019 18:57

Il faudrait utiliser la fonction ShellExecute (ou ShellExecuteWait ). Si on lui fournit un nom de dossier, elle ouvre l'explorateur Windows et affiche le dossier ; si c'est un nom de fichier, elle ouvre automatiquement ce fichier avec l'application par défaut. Dans ce cas, il suffit de d'abord lister les fichiers et ensuite les passer successivement à ShellExecute avec une boucle :

#include <File.au3>
#Include <Array.au3>

$dir = "C:\Desktop\CATALOGUE"

$list = _FileListToArray($dir, "*", $FLTA_FILES, True)
; _ArrayDisplay($list)  ; juste pour visualiser le truc

For $i = 1 to $list[0]
   ShellExecuteWait($list[$i])
Next
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

gequa
Niveau 1
Niveau 1
Messages : 7
Enregistré le : mar. 20 août 2019 10:52
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#9

Message par gequa » mar. 27 août 2019 20:19

Merci Mikell,
Entre temps, J'ai essayé
ShellExecute($dir)
WinActivate("CATALOGUE","")
Sleep(100)
Send("^a")
Send("{ENTER}")
et ça fonctionne!
Par contre, je ne sais pas comment mettre le focus sur la fenêtre de l'application Windows , Visionneuse de Windows, pour lui envoyer Send("{f11}") et lancer le diaporama, car le nom de la fenêtre est variable du style "nom de fichier-Visionneuse de Windows". J'ai essayé avec " *.jpg-Visionneuse de Windows" mais ça ne fonctionne pas.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5869
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#10

Message par mikell » mer. 28 août 2019 06:24

ça c'est pas compliqué, les fonctions Win* peuvent marcher avec juste une partie du titre si on définit d'abord l'option qui va bien

; à mettre en tête de script. 2 = match substring, -2 = le même mais case insensitive
Opt("WinTitleMatchMode", -2)
;...
WinActivate("visionneuse") ; et ça marche
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

gequa
Niveau 1
Niveau 1
Messages : 7
Enregistré le : mar. 20 août 2019 10:52
Status : Hors ligne

Re: FileOpenDialog - copier les fichiers sélectionnés dans un nouveau dossier

#11

Message par gequa » jeu. 29 août 2019 19:04

Ok, merci beaucoup!
le problème c'est que f11 passe les deux dernières fenêtres en plein écran (c'est bien le rôle de cette touche) mais ne lance pas le diaporama, comme c'est le cas, en manuel, si le focus est sur le fenêtre de la Visionneuse.
Commande qu'il est toujours possible d'exécuter manuellement ! :wink:
C'était juste pour le fun !
Merci pour tous vos conseils.
(Jolie région les Cévennes!)

Répondre