Page 1 sur 1

[Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 10:51
par timmalos
Bonjour A Tous

Ayant recemment, et comme beaucoup de francais, acheté un cadre photo numérique, j'ai fait un petit programme qui me permet d'aller chercher sur mon disque mes photos (environ 8 gigas) d'en prendre 300 aléatoirement et de les copier sur ma clef USB.
Ca peut servir à quelques personnes, facilement améliorable/modifiable.

Code : Tout sélectionner

#include<Array.au3>
#include "FileListToArrayEx.au3"

$adresse = "D:\photos\"
$nombre_photos = 100
$copy_to = "K:\"


MsgBox(0,"","Le Script va maintenant partir à la recherche de vos images... Patientez, cela peut prendre quelques minutes pour les très très gros dossiers")
Global $alea[$nombre_photos] , $i
Global $ar_Array = _FileListToArrayEx ($adresse, "*.jpg", 1, "", True)


For $i = 0 to $nombre_photos - 1
    $alea[$i] = Random(1,$ar_Array[0],1)
Next
MsgBox(0,"","Felicitations ! Les Images ont été choisis avec plaisir, et le script va maintenant les copier sur votre Disque Externe (USB, Mini-SD, etc...)")

;_ArrayDisplay($ar_Array, "Liste fichier")  ; Ceci est facultatif, c'est juste pour afficher la liste des fichiers.#cs ----------------------------------------------------------------------------

ProgressOn("Progression","Copie des fichiers sur la clef USB en cours")
For $i = 0 to $nombre_photos - 1
    FileCopy($ar_Array[$alea[$i]],$copy_to)
    ProgressSet(Int((100*$i)/$nombre_photos),Int((100*$i)/$nombre_photos) & " %")
Next
ProgressOff()
MsgBox(0,"","Maintenant, Profitez de la vie !!!")

Re: Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 10:53
par timmalos
Pour info , je suis passé par Random et pas un _ArraySwap ou Autre à cause de la probable taille de l'array ;)
Mettez le disque c:\ vous comprendrez.

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 12:33
par TaPuZ
Joli, et sympathique de ta part de partager.
Je me posais une question. Tu es parti du principe où le nombre de photos dans le dossier était fini et connu, et que tu en prenais un % parmi ce pool, de manière aléatoire.
J'avais déjà vu (sur l'ancien forum, il me semble) un moyen de connaitre le nombre de fichiers présent dans un dossier (mais je ne retrouve pas la fonction).
On pourrait prévoir qu'il "détecte" le nombre total de photo, et qu'il en prélève un % aléatoire. Ainsi, pas besoin de changer le script à chaque fois qu'on rajoute des photos.
Quelqu'un se rappelle-t-il de cette fonction?

A bientôt,
T@PµZ

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 13:32
par ani
$ar_Array[0] renvoi le nombre de fichier trouvé.
nombre photo = 100 < limité à cent.

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 14:13
par TaPuZ
J'ai enfin pu démontrer mon spécial! Mettre les pieds dans le plat! :mrgreen:
Merci pour l'info que j'avais sous les yeux. Effectivement, c'est ça.
Comment faire, si on veut renvoyer un nombre de dossiers, au lieu d'un nombre de fichiers?
Ou si on veut juste le nombre de fichiers images (tif, bmp, jpg, ...)?
Je sais, je sais, c'est pas mon topic, mais ça m'intéresse.
Merci encore.

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 14:15
par timmalos
Merci Ani pour l'editage du titre :lol:



TaPuZ, comme Ani te la expliqué, je ne connais pas le nombres de photos.

La fonction _FileListToArrayEx (Disponible dans Fonctions, post par Tlem) va chercher toutes les images et renvoie une array avec en position 0 le nombre de fichiers trouvés, ici le nombre d'images.


Mais chez moi, j'ai beaucoup trop d'images pour que ma clef USB les supportent tous. Donc le nombre_photo correspond au nombre d'images que tu souhaite transferer aleatoirement sur ta clef USB.

Je monte le chiffre a 500, bon rapport Temps/Nb Photos sur une clef USB 1 Giga , et ca me permet de prendre les photos aleatoirements je ne les choisis pas.

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 14:20
par timmalos
Comment faire, si on veut renvoyer un nombre de dossiers, au lieu d'un nombre de fichiers?

Code : Tout sélectionner

Global $ar_Array = _FileListToArrayEx ($adresse, "*.jpg", 2, "", False)
Va retourner tous les dossiers(pas les fichiers) d'un dossier, SANS prendre les SOUS-DOSSIERS

Code : Tout sélectionner

Global $ar_Array = _FileListToArrayEx ($adresse, "*.jpg", 2, "", TRUE)
Va retourner le nombre total de Dossiers dans $adresse recursivement, c'est à dire en prenant en compte TOUS les sous-dossiers.

Ou si on veut juste le nombre de fichiers images (tif, bmp, jpg, ...)?

Code : Tout sélectionner

Global $ar_Array = _FileListToArrayEx ($adresse, "*.jpg", 1, "", TRUE)
Global $ar_Array2 = _FileListToArrayEx ($adresse, "*.bmp", 1, "", TRUE)
Global $ar_Array3 = _FileListToArrayEx ($adresse, "*.tif", 1, "", TRUE)

$nombre_images = $ar_Array[0] +  $ar_Arra2[0] +  $ar_Array3[0]
Mais je pense qu'on peut faire mieux, mais la pas trop le temps.

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 14:34
par TaPuZ
Merci pour toutes ces réponses! J'ai enfin compris la fonction array!
Merci, j'étais à côté de la plaque à ce niveau.

EDIT : Juste un souci... Je dois encore merder, mais...
Global $ar_Array = _FileListToArrayEx ($adresse, "*.jpg", 2, "", False)
Est-ce que ça ne renvoit pas plutôt tout ce qui n'est pas fichier jpg? Et du coup, s'il s'agit d'un mélange de plein de fichiers? Ca fonctionne aussi?

Merci, A+

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 16:45
par Tlem
@TaPuZ
Vous devriez lire ce qui est écrit en haut de la fonction.
Cette première partie énumère les paramètres et donne leur fonction et valeurs.

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 17:01
par tolf
timmalos a écrit :

Code : Tout sélectionner

...
For $i = 0 to $nombre_photos - 1
    $alea[$i] = Random(1,$ar_Array[0],1)
Next
....
Petit problème envisageable : si Random renvoie deux fois le même nombre au cours de la sélection des photos, il y aura des photos en double donc il faut vérifier que la photo n'ait pas déjà été choisie (à moins que ce soit le but recherché :lol: ) :

Code : Tout sélectionner

Func _VerifiePhoto($alea, $iPhoto, $iRandom)
    Local $i
    For $i = 0 To $iPhoto
        If $alea[$i] = $iRandom Then Return 0
    Next
    Return 1
EndFunc
A intégrer dans le code :

Code : Tout sélectionner

For $i = 0 to $nombre_photos - 1
    Do
        $iRandom = Random(1,$ar_Array[0],1)
    Until _VerifiePhoto($alea, $i, $iRandom) = 1
    $alea[$i] = $iRandom
Next

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 19:33
par TaPuZ
@Tlem : Oops :oops: :oops: ! Un chti problème de comprenette aujourd'hui! J'ai pourtant relu x fois le topic ([Func] Recherche de fichiers et de dossiers.), et pourtant, je viens juste de piger que je calculais mal l'emplacement du $iFlag! Et comme le $iFiltre "*.jpg" m'enduisait d'erreur... Bon, je sais, je n'ai pas d'excuses, mais j'essayais juste de faire pale figure!

@Tolf :Bien joué! C'est ce que je voulais signaler aussi, mais vu comment je me noie dans un verre d'eau, j'ai bien fait! :p J'ai même pens" à un moment, qu'il y avait un paramètre inclus dans la func de choix aléatoire pour éviter les remises.

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 19:58
par timmalos
Par contre, mon code est débile ;)

Code : Tout sélectionner

Global $ar_Array = _FileListToArrayEx ($adresse, "*.jpg", 1, "", TRUE)
Global $ar_Array2 = _FileListToArrayEx ($adresse, "*.bmp", 1, "", TRUE)
Global $ar_Array3 = _FileListToArrayEx ($adresse, "*.tif", 1, "", TRUE)

$nombre_images = $ar_Array[0] +  $ar_Arra2[0] +  $ar_Array3[0]
Peut etre remplacer par ca :

Code : Tout sélectionner

Global $ar_Array = _FileListToArrayEx ($adresse, "*.jpg;*.tif;*.bmp", 1, "", TRUE)

$nombre_images = $ar_Array[0]]

Re: [Ex] Copie De Fichiers Aleatoires

Posté : lun. 01 juin 2009 21:12
par Tlem
Peut être à compléter avec _ArrayUnique. ;)