Page 1 sur 1
[R] DirGetSize avec extention de fichier uniquement
Posté : ven. 18 avr. 2014 15:19
par scorp84
Bonjour à tous,
J'ai développé un programme de sauvegarde de fichiers et pour le rapport de sauvegarde, j'ai besoin d'avoir une fonction équivalente à DirGetSize() mais pour laquelle je puisse définir une extension pour ne comparer que les fichiers dont les extensions correspondent à ce qui a été demandé pour la sauvegarde.
Exemple :
Sauvegarde de c:\tmp\*.doc vers c:\tmp2
Si on prend cet exemple, dans mon rapport, je veux afficher la taille et le nombre des fichiers .doc sur la source (c:\tmp) et sur la destination après sauvegarde (c:\tmp2 ) pour vérifier que la sauvegarde s'est bien déroulée.
J'ai développé la fonction suivante :
► Afficher le texte
Code : Tout sélectionner
#include<FileListToArray3.au3>
#include <Array.au3>
$timer1=TimerInit()
$tab1=f_DirGetSizeAvecExt(@MyDocumentsDir,"*.*")
$delta1=TimerDiff($timer1)/1000
$timer2=TimerInit()
$tab2=DirGetSize(@MyDocumentsDir,1)
$delta2=TimerDiff($timer2)/1000
ConsoleWrite("Taille :" & @TAB & $tab1[0] & " = " & $tab2[0] & @CRLF)
ConsoleWrite("Nb fichiers :" & @TAB & $tab1[1] & " = " & $tab2[1] & @CRLF)
ConsoleWrite("Nb sous rép :" & @TAB & $tab1[2] & " = " & $tab2[2] & @CRLF)
ConsoleWrite("Durée :" & @TAB & $delta1 & " = " & $delta2 & @CRLF)
Func f_DirGetSizeAvecExt($DGSAE_rep,$DGSAE_ext)
; Taille
$DGSAE_fichier_tab = _FileListToArray3 ($DGSAE_rep,$DGSAE_ext, 1, 1, 1,"")
; Raz taille
$DGSAE_taille=0
; Boucle fichiers pour taille
For $i=1 to UBound($DGSAE_fichier_tab)-1
$DGSAE_taille=$DGSAE_taille+FileGetSize($DGSAE_fichier_tab[$i])
Next
; Nb fichiers
$DGSAE_nbfichiers=UBound($DGSAE_fichier_tab)-1
; Récup sous rép
$DGSAE_rep_tab = _FileListToArray3 ($DGSAE_rep, "*", 2, 1, 0,"")
; Nb sous rép
$DGSAE_nb_rep=UBound($DGSAE_rep_tab)-1
; Préparation tableau return
$DGSAE_tab=$DGSAE_taille& "|" & $DGSAE_nbfichiers & "|" & $DGSAE_nb_rep
; Création tableau
$DGSAE_tab=StringSplit($DGSAE_tab,"|")
; Suppression ligne 0 pour correspondre au retour de DirGetSize
_ArrayDelete($DGSAE_tab,0)
Return $DGSAE_tab
EndFunc
J'ai utilisé _FileListToArray3() car c'est la seule fonction de recherche (
http://autoitscript.fr/forum/viewtopic.php?f=6&t=479) qui me sort la même chose que la fonction DirGetSize().
Par contre, j'ai des temps de recherche (Ex. : C:\) qui sont parfois 24 x plus longs avec ma fonction (boucle d'addition des taille oblige
Auriez-vous une idée pour l'optimiser ?
Merci d'avance.
Amicalement.
BM
Re: [..] DirGetSize avec extention de fichier uniquement
Posté : sam. 19 avr. 2014 00:17
par jguinch
Mon idée serait de lister tous les fichiers et calculer la taille dans le même temps, pour éviter de se taper deux fois la boucle...
Histoire de réinventer la roue, je m'étais bricolé ma propre fonction pour lister les fichiers, répertoires et sous-répertoires sans utiliser de fonction récursive.
J'ai donc fait une version modifiée de ma fonction pour essayer de répondre à ton besoin (qui pourrait être le mien aussi, d'ailleurs

)
► Afficher le texte
Code : Tout sélectionner
Local $timer1=TimerInit()
Local $tab1 = _DirGetSizeExt(@MyDocumentsDir, "*", 1)
Local $delta1=TimerDiff($timer1)/1000
Local $timer2=TimerInit()
Local $tab2 = DirGetSize(@MyDocumentsDir, 1)
Local $delta2=TimerDiff($timer1)/1000
ConsoleWrite("Taille :" & @TAB & $tab1[0] & " = " & $tab2[0] & @CRLF)
ConsoleWrite("Nb fichiers :" & @TAB & $tab1[1] & " = " & $tab2[1] & @CRLF)
ConsoleWrite("Nb sous rép :" & @TAB & $tab1[2] & " = " & $tab2[2] & @CRLF)
ConsoleWrite("Durée :" & @TAB & $delta1 & " = " & $delta2 & @CRLF)
; #FUNCTION# ====================================================================================================================
; Name ..........: _DirGetSizeExt
; Description ...: Returns the size in bytes of a file list by extension.
; Syntax ........: _DirGetSizeExt($sDir[, $sExt = "*"[, $iFlag = 0]])
; Parameters ....: $sDir - The directory to search in.
; $sExt - [optional] Extension of files to serch for. Default is "*" (all extensions).
; $iFlag - [optional] 0 (default) = Returns the size
; 1 = Extended mode is On -> returns an array that contains extended information (see Remarks).
; Return values .: Success = The size in bytes, or a single dimension array
; Failure = -1 and sets the @error flag to 1 if the path doesn't exist.
; Author ........: jguinch
; Remarks .......: If you use the extended mode then the array returned from this function is a single dimension array containing the following elements:
; $aArray[0] = Size
; $aArray[1] = Files count
; $aArray[2] = Dirs Count
; ===============================================================================================================================
Func _DirGetSizeExt($sDir, $sExt = "*", $iFlag = 0)
If NOT FileExists($sDir) Then Return SetError(1, 0, -1)
If $sExt = "*" Then $sExt = "?.*"
Local $aDirs[1] = [ $sDir ]
Local $iCountDir = 0, $iCountFile = 0, $n = 0
Local $hSearch, $sFileName
Local $iSize = 0
While 1
$hSearch = FileFindFirstFile( $aDirs[$n] & "\*.*" )
If $hSearch <> -1 Then
While 1
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @Extended Then
$iCountDir += 1
If $iCountDir >= UBound($aDirs) Then Redim $aDirs[ UBound($aDirs) * 2]
$aDirs[$iCountDir] = StringRegExpReplace($aDirs[$n], "\\$", "") & "\" & $sFileName
Else
If StringRegExp($sFileName, "(?i)\." & $sExt & "$") Then
$iSize += FileGetSize($aDirs[$n] & "\" & $sFileName)
$iCountFile += 1
EndIf
;ConsoleWrite($aDirs[$n] & "\" & $sFileName & @CRLF)
EndIf
WEnd
EndIf
FileClose($hSearch)
If $n = $iCountDir Then ExitLoop
$n += 1
WEnd
If NOT $iFlag Then Return $iSize
Local $aResult[3] = [ $iSize, $iCountFile, $iCountDir ]
Return $aResult
EndFunc
Edit : et donc du coup j'ai réinventé la roue encore une fois :
http://www.autoitscript.com/forum/topic ... getsizeex/ - mais la mienne est largement plus rapide (et n'utilise pas de fonction récursive)

Re: [..] DirGetSize avec extention de fichier uniquement
Posté : mar. 22 avr. 2014 11:16
par scorp84
Excellent (comme d'hab
Merci beaucoup.
Amicalement.
BM
Re: [R] DirGetSize avec extention de fichier uniquement
Posté : mar. 22 avr. 2014 15:05
par lesolutionneur
Quel est l'intérêt de ne pas utiliser de fonction récursive ? :O
Re: [R] DirGetSize avec extention de fichier uniquement
Posté : mar. 22 avr. 2014 21:54
par jguinch
@lesolutionneur : l'intérêt est de s'affranchir d'une limite de la récursivité (que SmOke_N évoque justement dans le
topic cité précédemment).