tri de fichier en fonction de la date de creation

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
ptiseb60
Niveau 2
Niveau 2
Messages : 23
Enregistré le : ven. 19 mai 2017 14:59
Status : Hors ligne

tri de fichier en fonction de la date de creation

#1

Message par ptiseb60 »

Bonjour a tous,

J'ai un dossier dans lequel différents fichiers arrivent quotidiennement, dans ce dossier j'ai des sous dossier correspondant au années passées et a l'année en cours nommé par exemple "2017". Je souhaite faire un script lancé par tache automatisé qui vérifie le contenu du dossier, puis classe les fichiers dans les bon dossiers en fonction de l'année de creation du fichier. tant qu'a faire je souhaiterais que ce dernier s'adapte tout seul au changement d'années a venir...

J'ai réfléchis et je pense avoir compris les différentes étapes :

1 - lire le contenu d'un dossier (hors sous dossiers) avec _filelisttoarray
2 - vérifier l'année de creation du fichier avec filegettime
3 - vérifier si un dossier correspondant est present avec fileexists
4 - si besoin créer le dossier avec dircreate
5 - déplacer les fichiers avec Filemove

Je précise que je suis débutant.

L’étape 1 est ok pas de soucis j'arrive bien a lire le contenu du dossier

Code : Tout sélectionner

Global $sFilePath="\\chemin vers mon dossier"
Global $aFileList=_FileListToArray($sFilePath,"*",1)
c'est après que ça coince (eh oui je ne suis pas arrivé bien loin)
J'ai commencé ça mais sans trop de conviction :

Code : Tout sélectionner

for $i=1 to $aFileList[0]
	$liste_date=FileGetTime($aFileList[$i], $FT_CREATED, 0)
        if $liste_date[0] = "2017" then
		FileCopy($aFileList[$i], "2017")
	Else
		DirCreate($liste_date[0])
		FileCopy($aFileList[$i], $liste_date[0])
	EndIf
Next

Je vous remercie par avance pour votre aide
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#2

Message par walkson »

Bonjour et bienvenue sur le forum
Voilà ce que je vous propose (si j'ai bien compris):
#include <Array.au3>
#include <File.au3>

   $aArray = _FileListToArrayRec("D:\Mes Documents D\bureau autoit\Array", "*", $FLTAR_FILES, $FLTAR_RECUR , $FLTAR_SORT, $FLTAR_FULLPATH )
   _ArrayDisplay($aArray)

   For $i = 1 To $aArray[0]
      $ArrayTime = FileGetTime ($aArray[$i],$FT_MODIFIED )
      _ArrayDisplay($ArrayTime)
      If Not FileExists(@ScriptDir & "\" & $ArrayTime[0]) Then DirCreate ( @ScriptDir & "\" & $ArrayTime[0])
      FileCopy($aArray[$i],@ScriptDir & "\" & $ArrayTime[0])

   Next
Les _ArrayDisplay() sont là pour voir et ne sont pas utiles
j'ai mis aussi $FT_MODIFIED car j'ai des fichiers créés en 2017 et modifiés en 2015
et enfin j'utilise _FileListToArrayRec() pour avoir les sous dossiers
Pour avoir les fichiers de l'année If @YEAR = $ArrayTime[0] Then FileCopy($aArray[$i],@ScriptDir & "\" & $ArrayTime[0])
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
ptiseb60
Niveau 2
Niveau 2
Messages : 23
Enregistré le : ven. 19 mai 2017 14:59
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#3

Message par ptiseb60 »

Bonjour et un grand merci Walkson,

J'avais fini par trouver une solution qui fonctionne pour l'année en cours mais j'ai un gros doute pour les années future et je n'ai pas encore eu l'occasion de tester avec des anciens fichiers.

En tout cas un grand merci j'ai testé, modifier un peut car je ne veux pas toucher au sous dossier :

Code : Tout sélectionner

#include <Array.au3>
#include <File.au3>
$sFilePath="mon dossier"
$aArray = _FileListToArray($sFilePath, "*", $FLTAR_FILES)


	For $i = 1 To $aArray[0]
		$ArrayTime = FileGetTime ($aArray[$i],$FT_MODIFIED )
			If Not FileExists($sFilePath & "\" & $ArrayTime[0]) Then DirCreate ( $s & "\" & $ArrayTime[0])
			FileMove($aArray[$i],$sFilePath & "\" & $ArrayTime[0])

        Next
ptiseb60
Niveau 2
Niveau 2
Messages : 23
Enregistré le : ven. 19 mai 2017 14:59
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#4

Message par ptiseb60 »

En fin de compte je me rend compte d'un soucis avec le script,
Je ne peu pas laisser l’exécutable dans le dossier a traiter car il serait lui même traitée et déplacé.
Je ne peut donc pas laisser comme chemin "@scriptdir".
Par contre quand je rentre le chemin du dossier a traiter j'ai une erreur :
Subscript used on non-accessible variable.:
If Not FileExists($sFilePath & "\" & $ArrayTime[0]) Then DirCreate ( $sFilePath & "\" & $ArrayTime[0])
If Not FileExists($sFilePath & "\" & $ArrayTime^ ERROR
$FilePath étant la variable contenant le chemin vers mon dossier a traiter
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation  

#5

Message par orax »

FileGetTime retourne surement une erreur parce qu'il ne doit pas trouver le fichier ($aArray[$i]).
Une solution est de récupérer le chemin complet de chaque fichier :
$aArray = _FileListToArray($sFilePath, "*", $FLTAR_FILES, True)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
ptiseb60
Niveau 2
Niveau 2
Messages : 23
Enregistré le : ven. 19 mai 2017 14:59
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#6

Message par ptiseb60 »

Bonjour,

Je souhaite faire évoluer mon script pour ne déplacer que les fichier antérieur au mois en cours et les ranger dans les dossier nommé par l'année et le mois comme suit :
2018-01 pour janvier 2018.
Voici où j'en suit :

Code : Tout sélectionner

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


$sFilePath="\\serveur1\logs"


$aArray = _FileListToArray("\\serveur1\logs", "*", $FLTAR_FILES)



	For $i = 1 To $aArray[0]

		$ArrayTime = FileGetTime ($aArray[$i],$FT_MODIFIED )


			If Not FileExists($sFilePath & "\" & $ArrayTime[0] & "-" & $ArrayTime[1]) Then DirCreate ( $sFilePath & "\" & $ArrayTime[0]&"-"&$ArrayTime[1])

			if $ArrayTime[0]&"-"&$ArrayTime[1] <> @YEAR&"-"&@MON then FileMove($aArray[$i],$sFilePath & "\" & $ArrayTime[0]&"-"&$ArrayTime[1])


	Next
Mais je rencontre cette erreur lors de l’exécution :

--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
"S:\@ Trier\Scripts\traitement old logs\traitement-old logs.au3" (21) : ==> Subscript used on non-accessible variable.:
If Not FileExists($sFilePath & "\" & $ArrayTime[0] & "-" & $ArrayTime[1]) Then DirCreate ( $sFilePath & "\" & $ArrayTime[0]&"-"&$ArrayTime[1])
If Not FileExists($sFilePath & "\" & $ArrayTime^ ERROR
->16:56:11 AutoIt3.exe ended.rc:1
+>16:56:11 AutoIt3Wrapper Finished.


Help me please je suis completement perdu...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#7

Message par Tlem »

Bonsoir.

En lisant votre code, je constate plusieurs choses :
  • $FLTAR_FILE n’existe pas ! C'est $FLTA_FILES (pas de R) ou 1 si vous préférez.
  • Vous ne faites aucune vérification sur $aArray !!! Le minimum avant de continuer le code, serait de vérifier si cette variable est bien un tableau (idem pour $ArrayTime). ^^
  • Vous vérifiez si le dossier d'archivage existe, mais vous ne vérifiez pas s'il a bien été créé !
  • Le FileMove ne fonctionnera pas car $aArray ne contien que les noms des fichiers. Vous devez utiliser $bReturnPath sur la fonction _FileListToArray.
  • Attention avec la ligne du MoveFile, si la date du PC est erronée, cela risque de mettre un sacré bazar !
  • Pour finir, vous ne vérifiez pas si le fichier à bien été déplacé !!!
Juste une petite amélioration possible :
La commande FileMove possède l'option $FC_CREATEPATH (8). Du coup vous pourriez éviter la vérification de l’existence du dossier cible et ne vérifier que le déplacement du fichier. ;)
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é".
ptiseb60
Niveau 2
Niveau 2
Messages : 23
Enregistré le : ven. 19 mai 2017 14:59
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#8

Message par ptiseb60 »

Super un grand merci a toi Tlem,

J'ai modifié mon code en prenant en compte tes précieuses infos et miracle ça fonctionne!
Reste en effet la question de la vérification du déplacement des fichiers (je réfléchi encore a comment m'y prendre) et la question de l'heure du pc, mais ça sera exécuté en tache planifiée par le contrôleur de domaine qui fait aussi office de serveur de temps pour le domaine je pense que ça ne devrait pas poser de problème.

voila ce que ca donne pour le moment :
#include <Array.au3>
#include <File.au3>

$sFilePath="\\apollon\Disque D\logs"
$aArray = _FileListToArray("\\apollon\Disque D\logs", "*", $FLTA_FILES, true)

if IsArray($aArray) Then
   For $i = 1 To $aArray[0]
      $ArrayTime = FileGetTime ($aArray[$i],$FT_MODIFIED )
      if IsArray($ArrayTime) Then
         if $ArrayTime[0]&"-"&$ArrayTime[1] <> @YEAR&"-"&@MON Then
            FileMove($aArray[$i],$sFilePath&"\"&$ArrayTime[0]&"-"&$ArrayTime[1],$FC_OVERWRITE + $FC_CREATEPATH)
         EndIf
      EndIf
   Next
EndIf
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#9

Message par Tlem »

Bonsoir.

Pour contrôler le déplacement (à adapter) :

Code : Tout sélectionner

Local $sFilePath="\\apollon\Disque D\logs"
Local $aArray = _FileListToArray("\\apollon\Disque D\logs", "*", $FLTA_FILES, true)
Local $sMoveErr=""

if IsArray($aArray) Then
        For $i = 1 To $aArray[0]
                $ArrayTime = FileGetTime ($aArray[$i],$FT_MODIFIED )
                if IsArray($ArrayTime) Then
                        if $ArrayTime[0]&"-"&$ArrayTime[1] <> @YEAR&"-"&@MON Then
                                If Not FileMove($aArray[$i],$sFilePath&"\"&$ArrayTime[0]&"-"&$ArrayTime[1],$FC_OVERWRITE + $FC_CREATEPATH) Then
					$sMoveErr &= $aArray[$i] & @CRLF
				EndIf
                        EndIf
                EndIf
        Next
EndIf

If $sErr <> "" MsgBox(16, "Erreur", "Attention, les fichiers suivant n'ont pas pu être déplacés :" & @CRLF & $sMoveErr)
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
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: tri de fichier en fonction de la date de creation

#10

Message par ZDS »

Bonjour Ptiseb60,

Une bonne pratique à considérer le plus tôt possible : si tu laisses ton script en plan pendant des semaines, et que tu le reprends plus tard, la chose qu'il faut faire à chaque fois c'est le commenter ^^ et donner à tes variables des noms qui veulent dire quelque chose.

Voila une version plus blablatée (peut-être trop), qui pourrait t'être utile (gestion des erreurs entre autres) :

Code : Tout sélectionner

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

; Définition des dossiers source et cible
Global $sourceFolder = "\\apollon\Disque D\logs"
Global $targetFolder = "\\apollon\Disque D\logs"
Global $errorsFile   = @ScriptDir&"\errors.log"

; Récupération de la liste des fichiers
Global $errorsList = ""
Global $files = _FileListToArray($sourceFolder, "*", $FLTA_FILES, true)
If @error Then
	; Dossier introuvable / illisible
	Msgbox(0, "", "Dossier source introuvable ou illisible"&@CRLF&@CRLF&"FIN DU SCRIPT")
	Exit
EndIf

; Pour chaque fichier $files[$i]
For $i = 1 To $files[0]
	Local $time = FileGetTime($files[$i], $FT_MODIFIED)
	If @error Then
		; Date inutilisable, on reprend la boucle for au début et on passe au fichier suivant
		ContinueLoop
	EndIf
	Local $subFolder = $time[0]&"-"&$time[1]
	If $subFolder = @YEAR&"-"&@MON Then
		; Mois en cours, on reprend la boucle for au début et on passe au fichier suivant
		ContinueLoop
	EndIf
	; Déplacement du fichier
	Local $resultat = FileMove($files[$i], $targetFolder&"\"&$subFolder, $FC_OVERWRITE+$FC_CREATEPATH)
	If Not $resultat Then
		; Fichier non déplacé, on génère l'erreur avec la date actuelle, et on l'ajoute à la liste des erreurs en cours
		Local $error = generateError("Erreur de déplacement dans '"&$subFolder&"'", $files[$i])
		$errorsList &= $error&@CRLF
	EndIf
Next
; Si il y a eu des erreurs, on sauve dans un fichier et on affiche les erreurs en question dans une MsgBox
If $errorsList <> "" Then
	saveErrors($errorsList, $errorsFile)
	MsgBox(0, "", "Il y a eu des erreurs :"&@CRLF&$errorsList, 30)
Else ; Sinon, c'est que tout est OK
	MsgBox(0, "", "Déplacement OK !", 15)
EndIf
; ATTENTION : Les MsgBox sont bloquantes, pensez à mettre un timeout (15 ou 30 secondes par exemple)

Exit

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Fonction pour générer une erreur proprement
Func generateError($texte, $fichier)
	Local $date = @MDAY&"/"&@MON&"/"&@YEAR&"-"&@HOUR&":"&@MIN&":"&@SEC
	Return $date & " => " & $texte & " : '" & $fichier & "'"
EndFunc

; Fonction pour enregistrer les erreurs dans un fichier (en le créant si besoin)
Func saveErrors(ByRef $texte, $fichier)
	; Si le fichier n'existe pas, $FO_CREATEPATH permet de le créer
	Local $flux = FileOpen($fichier, $FO_APPEND+$FO_CREATEPATH)
	If @error Then
		$texte &= "IMPOSSIBLE DE CREER UN FICHIER D'ERREUR"
	Else
		FileWrite($flux, $texte)
		FileClose($flux)
	EndIf
EndFunc

A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Répondre