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