[...] DirGetSizeEx pour trouvé \ Gestions de doublons\owners
Posté : jeu. 22 oct. 2015 19:32
par gh0stid
Histoire longue, faite courte..
j'aurais aimer effacer mon autre topic, il est rendu très dure a suivre.. j'en fais donc un nouveau
jai un lot de contrainte a respecté.. je dois :
1- Rechercher tous les fichiers de type *.nsf *.ndk notes.ini *.id et ce, sur le C: le G: et le H: en sortir l'espace disque occuper et loger le tout. --- Tous ca, en gros, c'est fait avec l'aide du UDF _DirGetSizeEx, FileOpen, FileWriteLine etc.
2- une fois toute ces belles info cumulé et mise en array avec _DirGetSizeEx, je me dois de les copiers sur un $storage --- ce bout la est ok, j'ai regler aussi le probleme du array qui sort uniquement un PATH aulieu dun filename, ce qui empechait ma copie. j'utilise une fonction : _SBfpsplit
2a - SI ceux du LECTEUR G: le FILE OWNERSHIP match @username, copier, sinon passer au suivant --- j'ai un debut de code, qui est fonctionnel,seulement pour trouvé le owner, mais je peux pas pas changer pour autre chose que une variable Global du genre @scriptfullpath ( je ne comprend pas pourquoi ..
2b - SI un doublons, je dois le renommé avec *_1."extension" _2 etc .. --- j'ai essayer, mais sans succès a mon grand regret. voici le bout de code que j'ai "tenter" de faire.. je CROIS que je ne suis pas loin de la realité je me suis inspiré des exemples trouvé sur le net et du coup de main fournit par une personne ici !
j'espere le tout suffisement claire...
et si possible supprimé mon ancien TOPIC.
voici le code en entier :
j'aurais aimer effacer mon autre topic, il est rendu très dure a suivre.. j'en fais donc un nouveau
jai un lot de contrainte a respecté.. je dois :
1- Rechercher tous les fichiers de type *.nsf *.ndk notes.ini *.id et ce, sur le C: le G: et le H: en sortir l'espace disque occuper et loger le tout. --- Tous ca, en gros, c'est fait avec l'aide du UDF _DirGetSizeEx, FileOpen, FileWriteLine etc.
2- une fois toute ces belles info cumulé et mise en array avec _DirGetSizeEx, je me dois de les copiers sur un $storage --- ce bout la est ok, j'ai regler aussi le probleme du array qui sort uniquement un PATH aulieu dun filename, ce qui empechait ma copie. j'utilise une fonction : _SBfpsplit
2a - SI ceux du LECTEUR G: le FILE OWNERSHIP match @username, copier, sinon passer au suivant --- j'ai un debut de code, qui est fonctionnel,seulement pour trouvé le owner, mais je peux pas pas changer pour autre chose que une variable Global du genre @scriptfullpath ( je ne comprend pas pourquoi ..
► Afficher le texte
Code : Tout sélectionner
MsgBox('', '', _fileOwner(@AppDataDir))
MsgBox('', '', @UserName)
MsgBox('', '', @ScriptFullPath)
Func _fileOwner($varname)
Dim $objSD
Local $oWMIService = ObjGet("winmgmts:")
Local $oFolderSecuritySettings = $oWMIService.Get("Win32_LogicalFileSecuritySetting='" & $varname & "'")
Local $intRetVal = $oFolderSecuritySettings.GetSecurityDescriptor($objSD)
If $intRetVal = 0 Then
;Local $objStr = $objSD.Owner.Domain & "\" & $objSD.Owner.Name;
Local $objStr = $objSD.Owner.Name;
Return($objStr)
Else
Return("Couldn't retrieve security descriptor.")
EndIf
EndFunc
► Afficher le texte
Code : Tout sélectionner
Func _ProcessNSFCopy($aNSFFiles)
For $i = 1 To $aNSFFiles[0][0]
local Static $x = 0
local $Suffixe
$SBPath = $aNSFFiles[$i][0]
$SBType = 3
If FileExists($SBPath) Then
$Suffixe = "_" & $x
$sFileName = _SBfpsplit($SBPath, $SBType)
$sFileName = $sFileName & $Suffixe
Else
$sFileName = _SBfpsplit($SBPath, $SBType)
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] Copie de " & $aNSFFiles[$i][0] & " (" & _ReadableSize($aNSFFiles[$i][1]) & ") => " & $storage & $sFileName&@CRLF)
If FileCopy($aNSFFiles[$i][0], $storage & $sFileName, 9) Then
$sText = "Copie effectuee avec success"
Else
$sText = "ERREUR lors de la copie du fichier"
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] " & $sText)
$x += 1
Next
EndFunc
et si possible supprimé mon ancien TOPIC.
voici le code en entier :
► Afficher le texte
Code : Tout sélectionner
#include <Date.au3>
#include <Array.au3>
#include <File.au3>
Local $logfile = "c:\bulk\NSF.log"
Local $storage = "C:\bulk\backup_test\" & @UserName & "\"
Local $hLogFile = FileOpen($logfile, 1) ;1 = append au fichier, utiliser 2 si on veut overwrite
; ##### Pour le traitement sur c:\ g:\ h:\ ################################################################################
;creation des variables de recherche a l'aide de la fonction homemade _DirGetSizeEx
FileWriteLine($hLogFile, "[" & _Now() & "] Recherche des fichiers NSF NDK et INI sur C:\ G:\ et H:\ pour l'utilisateur " & @USERNAME)
Local $aFiles = _DirGetSizeEx("c:\", "*.nsf", 1)
Local $aFilesNDK = _DirGetSizeEx("c:\", "*.ndk", 1)
Local $aFilesINI = _DirGetSizeEx("c:\", "notes.ini", 1)
Local $aFilesG = _DirGetSizeEx("\\fs1\groupes\", "*.nsf", 1)
Local $aFilesH = _DirGetSizeEx("\\fs2\home\", "*.nsf", 1)
If IsArray($aFiles) Then
FileWriteLine($hLogFile, "[" & _Now() & "] -> C:\ " & $aFiles[0][0] & " fichiers trouves pour une taille de " & _ReadableSize($aFiles[0][1]))
_ProcessNSFCopy($aFiles)
EndIf
If IsArray($aFilesINI) Then
FileWriteLine($hLogFile, "[" & _Now() & "] -> C:\ " & $aFilesINI[0][0] & " fichiers trouves pour une taille de " & _ReadableSize($aFilesINI[0][1]))
_ProcessNSFCopy($aFilesINI)
EndIf
If IsArray($aFilesNDK) Then
FileWriteLine($hLogFile, "[" & _Now() & "] -> C:\ " & $aFilesNDK[0][0] & " fichiers trouves pour une taille de " & _ReadableSize($aFilesNDK[0][1]))
_ProcessNSFCopy($aFilesNDK)
EndIf
If IsArray($aFilesG) Then
FileWriteLine($hLogFile, "[" & _Now() & "] -> G:\ " & $aFilesG[0][0] & " fichiers trouves pour une taille de " & _ReadableSize($aFilesG[0][1]))
_ProcessNSFCopyG($aFilesG)
EndIf
If IsArray($aFilesH) Then
FileWriteLine($hLogFile, "[" & _Now() & "] -> H:\ " & $aFilesH[0][0] & " fichiers trouves pour une taille de " & _ReadableSize($aFilesH[0][1]))
_ProcessNSFCopyH($aFilesH)
EndIf
; #################################################################################################################
FileWriteLine($hLogFile, "[" & _Now() & "] Fin")
Func _ProcessNSFCopy($aNSFFiles)
For $i = 1 To $aNSFFiles[0][0]
local Static $x = 0
local $Suffixe
$SBPath = $aNSFFiles[$i][0]
$SBType = 3
If FileExists($SBPath) Then
$Suffixe = "_" & $x
$sFileName = _SBfpsplit($SBPath, $SBType)
$sFileName = $sFileName & $Suffixe
Else
$sFileName = _SBfpsplit($SBPath, $SBType)
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] Copie de " & $aNSFFiles[$i][0] & " (" & _ReadableSize($aNSFFiles[$i][1]) & ") => " & $storage & $sFileName&@CRLF)
If FileCopy($aNSFFiles[$i][0], $storage & $sFileName, 9) Then
$sText = "Copie effectuee avec success"
Else
$sText = "ERREUR lors de la copie du fichier"
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] " & $sText)
$x += 1
Next
EndFunc
Func _ProcessNSFCopyINI($aNSFFilesINI)
For $i = 1 To $aNSFFilesINI[0][0]
$SBPath = $aNSFFilesINI[$i][0]
$SBType = 3
$sFileName = _SBfpsplit($SBPath, $SBType)
FileWriteLine($hLogFile, "[" & _Now() & "] Copie de " & $aNSFFilesINI[$i][0] & " (" & _ReadableSize($aNSFFilesINI[$i][1]) & ") => " & $storage & $sFileName&@CRLF)
If FileCopy($aNSFFilesINI[$i][0], $storage & $sFileName, 9) Then
$sText = "Copie effectuee avec success"
Else
$sText = "ERREUR lors de la copie du fichier"
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] " & $sText)
Next
EndFunc
Func _ProcessNSFCopyNDK($aNSFFilesNDK)
For $i = 1 To $aNSFFilesNDK[0][0]
$SBPath = $aNSFFilesNDK[$i][0]
$SBType = 3
$sFileName = _SBfpsplit($SBPath, $SBType)
FileWriteLine($hLogFile, "[" & _Now() & "] Copie de " & $aNSFFilesNDK[$i][0] & " (" & _ReadableSize($aNSFFilesNDK[$i][1]) & ") => " & $storage & $sFileName&@CRLF)
If FileCopy($aNSFFilesNDK[$i][0], $storage & $sFileName, 9) Then
$sText = "Copie effectuee avec success"
Else
$sText = "ERREUR lors de la copie du fichier"
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] " & $sText)
Next
EndFunc
Func _ProcessNSFCopyG($aNSFFilesG)
For $i = 1 To $aNSFFilesG[0][0]
$SBPath = $aNSFFilesG[$i][0]
$SBType = 3
$sFileName = _SBfpsplit($SBPath, $SBType)
FileWriteLine($hLogFile, "[" & _Now() & "] Copie de " & $aNSFFilesG[$i][0] & " (" & _ReadableSize($aNSFFilesG[$i][1]) & ") => " & $storage & $sFileName&@CRLF)
If _fileOwner($aNSFFilesG[$i][0]) = @UserName Then _NSFCopyG()
Func _NSFCopyG($aNSFFilesG)
If FileCopy($aNSFFilesG[$i][0], $storage & $sFileName, 9) Then
$sText = "Copie effectuee avec success"
Else
$sText = "ERREUR lors de la copie du fichier"
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] " & $sText)
Next
EndFunc
Func _ProcessNSFCopyH($aNSFFilesH)
For $i = 1 To $aNSFFilesH[0][0]
$SBPath = $aNSFFilesH[$i][0]
$SBType = 3
$sFileName = _SBfpsplit($SBPath, $SBType)
FileWriteLine($hLogFile, "[" & _Now() & "] Copie de " & $aNSFFilesH[$i][0] & " (" & _ReadableSize($aNSFFilesH[$i][1]) & ") => " & $storage & $sFileName&@CRLF)
If FileCopy($aNSFFilesH[$i][0], $storage & $sFileName, 9) Then
$sText = "Copie effectuee avec success"
Else
$sText = "ERREUR lors de la copie du fichier"
EndIf
FileWriteLine($hLogFile, "[" & _Now() & "] " & $sText)
Next
EndFunc
FileClose($hLogFile)
; #FUNCTION#====================================================================================================================
; Name ..........: _DirGetSizeEx ; Description ...: Returns the size in bytes of a file list by extension.
; Syntax ........: _DirGetSizeEx($sDir[, $sMask = "*"[, $iFlag = 0]])
; Parameters ....: $sDir - The directory to search in.
; $sMask - [optional] Filter for results. Default is "*" (all).
; Filter for result. Multiple filters must be separated by ";"
; Use "|" to separate 3 possible sets of filters: "Include|Exclude|Exclude_Folders"
; Include = Files/Folders to include (default = "*" [all])
; Exclude = Files/Folders to exclude (default = "" [none])
; Exclude_Folders = only used if $iRecur = 1 AND $iReturn <> 2 to exclude defined folders (default = "" [none])
; $iFlag - [optional] 0 (default) = Returns the size
; 1 = Extended mode is On -> returns an array that contains the file of each file (see Remarks).
; 2 = Don't get the size of files in subdirectories (recursive mode is Off)
; 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 followingelements:
; $aArray[0][0] = Files count
; $aArray[0][1] = Total files size
; $aArray[1][0] = Full name of 1st file
; $aArray[1][1] = Size of 1st file
; $aArray[2][0] = Full name of 2nd file
; $aArray[2][1] = Size of 2nd file
; $aArray[n][1] = Size of nth file
; $aArray[n][1] = Size of nth file
;===============================================================================================================================
Func _DirGetSizeEx($sDir, $sMask = "*", $iFlag = 0); OK
If NOT FileExists($sDir) Then Return SetError(1, 0, -1)
If NOT StringInStr(FileGetAttrib($sDir), "D") Then Return SetError(1, 0, -1)
Local $iExtMode = BitAND($iFlag, 1) > 0
Local $iRecMode = NOT BitAND($iFlag, 2) > 0
Local $aDirs[1] = [ StringRegExpReplace($sDir, "\\$", "") ]
Local $iCountDir = 0, $iCountFile = 0, $n = 0, $iSize = 0, $iFullSize = 0
Local $aFiles[1][2] = [[0]]
Local $hSearch, $sFileName, $sRegexFilesInclude, $sRegexFilesExclude = "^$", $sRegexFoldersExclude = "^$"
Local $sRegexMask = StringReplace( StringReplace( StringReplace($sMask, "|", "\|") , "?", "\E(?:.|.?$)\Q"), "*", "\E.*?\Q")
Local $aFilters = StringSplit($sRegexMask, "\|", 3)
$sRegexFilesInclude = "(?i)^(?:" & StringRegExpReplace(StringReplace($aFilters[0], ";", "|") , "([^|]+)", "\\Q$1\\E") & ")$"
If UBound($aFilters) > 1 Then $sRegexFilesExclude = "(?i)^(?:" & StringRegExpReplace(StringReplace($aFilters[1], ";", "|") , "([^|]+)", "\\Q$1\\E") & ")$"
If UBound($aFilters) > 2 Then $sRegexFoldersExclude = "(?i)^(?:" & StringRegExpReplace(StringReplace($aFilters[2], ";", "|") , "([^|]+)", "\\Q$1\\E") & ")$"
While 1
$hSearch = FileFindFirstFile( $aDirs[$n] & "\*.*" )
If $hSearch <> -1 Then
While 1
$sFileName = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @Extended Then
If NOT StringRegExp($sFileName, $sRegexFoldersExclude) Then
$iCountDir += 1
If $iCountDir >= UBound($aDirs) Then Redim $aDirs[UBound($aDirs) * 2]
$aDirs[$iCountDir] = $aDirs[$n] & "\" & $sFileName
EndIf
Else
If StringRegExp($sFileName, $sRegexFilesInclude) AND NOT StringRegExp($sFileName, $sRegexFilesExclude) Then
$iSize = FileGetSize($aDirs[$n] & "\" &$sFileName)
$iFullSize += $iSize
If $iExtMode Then
$iCountFile += 1
If $iCountFile >= UBound($aFiles) Then Redim $aFiles[UBound($aFiles) * 2][2]
$aFiles[$iCountFile][0] = $aDirs[$n] & "\" &$sFileName
$aFiles[$iCountFile][1] = $iSize
EndIf
EndIf
EndIf
WEnd
If NOT $iRecMode Then ExitLoop
EndIf
FileClose($hSearch)
If $n = $iCountDir Then ExitLoop
$n += 1
WEnd
If NOT $iExtMode Then Return $iFullSize
Redim $aFiles[$iCountFile + 1][2]
$aFiles[0][0] = $iCountFile
$aFiles[0][1] = $iFullSize
Return $aFiles
EndFunc
Func _ReadableSize($iSize, $decimalplaces = 2)
Local $aUnites = [1024, "octets", "Ko", "Mo", "Go", "To"]
For $i = 2 To UBound($aUnites) - 1
If $iSize < $aUnites[0] Then ExitLoop
$iSize /= $aUnites[0]
Next
Return Round($iSize, $decimalplaces) & " " & $aUnites[$i - 1]
EndFunc
;#FUNCTION# ====================================================================================================
; Name...........: _SBfpsplit
; Description ...: Splits a file path into Drive, path, filename, or extension.
; Syntax.........: _SBfpsplit($SBPath, $SBType);$SBpath (file path to evaluate) , $SBType (option)
; Parameters ....:
;|1 = Drive ex. D:
;|2 = Path ex. D:\1111\dir\file.txt
;|3 = File name ex. file.txt
;|4 = Extension ex. txt
;|5 = Drive letter only ex. D
; Author ........: Scott E. Brown ripandreplace@eset.com
; Modified.......:04/03/2009
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......; _SBfpsplit("D:\1111\dir\file.txt, 1)
;
;$path = "D:\1111\dir\test.txt"
;ConsoleWrite(_SBfpsplit($path, 1) & @CRLF)
;ConsoleWrite(_SBfpsplit($path, 2) & @CRLF)
;ConsoleWrite(_SBfpsplit($path, 3) & @CRLF)
;ConsoleWrite(_SBfpsplit($path, 5) & @CRLF)
; ====================================================================================================
Func _SBfpsplit($SBPath, $SBType);$SBpath = file path to evaluate , $SBType = 1 for Drive, 2 for Path, 3 for File name, 4 for extension, 5 for drive letter only
Local $SBfile, $SBSplit, $SBdrive, $SBfilepath, $SBnumber
$SBSplit = StringSplit($SBPath, "\"); split into array
$SBnumber = $SBSplit[0]; the number of strings returned
$SBfilepath = ""
for $1 = 1 to $SBnumber -1
$SBfilepath = $SBfilepath & $SBSplit[$1] & "\"; path
Next
$SBfile = $SBSplit[($SBsplit[0])]; file
$SBdrive = $SBSplit[1]; drive
$SBfs = StringSplit($SBPath, "."); split into array
;MsgBox(4096, "Path", $SBSfs[0])
if $SBfs[0] = 1 then
$SBExt = ""; no extension found
Else
$SBExt = $SBfs[($SBfs[0])]; last . extentsion
EndIf
If $SBType = 1 then Return $SBdrive
If $SBType = 2 then Return $SBfilepath
If $SBType = 3 then Return $SBfile
If $SBType = 4 then Return $SBExt
If $SBType = 5 then Return StringLeft($SBdrive, 1)
EndFunc
Func _fileOwner($varname)
Dim $objSD
Local $oWMIService = ObjGet("winmgmts:")
Local $oFolderSecuritySettings = $oWMIService.Get("Win32_LogicalFileSecuritySetting='" & $varname & "'")
Local $intRetVal = $oFolderSecuritySettings.GetSecurityDescriptor($objSD)
If $intRetVal = 0 Then
;Local $objStr = $objSD.Owner.Domain & "\" & $objSD.Owner.Name;
Local $objStr = $objSD.Owner.Name;
Return($objStr)
Else
Return("Couldn't retrieve security descriptor.")
EndIf
EndFunc