Code : Tout sélectionner
#include <Array.au3>
Global Const $adInteger = 3
Global Const $adVarChar = 200
Local $Timer, $Path = @ScriptDir
$Timer = TimerInit()
Local $oRs = Folders_Files_RecordSet($Path)
ConsoleWrite("Version RecordSet (" & $oRs.RecordCount & " rows) en ms: " & TimerDiff($Timer) & @LF)
Local $aAr = $oRs.GetRows()
_ArrayDisplay($aAr, "Liste des fichier RS: " & $oRs.RecordCount & " rows", -1, 0, "", "|", "iRow|Type|Name|Path")
Func Folders_Files_RecordSet($Path, $iReturn = 0)
Local $oFSO = ObjCreate("Scripting.FileSystemObject")
If Not $oFSO.FolderExists($Path) Then Return SetError(1, 1, "")
; on initialise le RecordSet pour la sortie version RecordSet
Local $oRs = ObjCreate("ADODB.Recordset")
$oRs.Fields.Append("Type", $adVarChar, 255)
$oRs.Fields.Append("Name", $adVarChar, 255)
$oRs.Fields.Append("Path", $adVarChar, 255)
$oRs.Open
Local $oFolder = $oFSO.GetFolder($Path)
Switch $iReturn
Case 2 ; Folders only
__Rec_Folders_Files_RecordSet($oRs, $oFolder, True, False)
Case 1 ; Files only
__Rec_Folders_Files_RecordSet($oRs, $oFolder, False, True)
Case Else ; Both
__Rec_Folders_Files_RecordSet($oRs, $oFolder)
EndSwitch
$oFSO = 0
; Si on trie pas se repositionner à la 1ère ligne du RecordSet
;~ $oRs.MoveFirst
; on fait le trie du RecordSet
$oRs.Sort = "Type Desc, Path, Name"
Return $oRs ; Le RecordSet lui même
EndFunc
Func __Rec_Folders_Files_RecordSet(ByRef $oRs, ByRef $oFolder, $Folders = True, $Files = True)
; Parcours des dossiers
For $oSubFolder In $oFolder.SubFolders
If $Folders Then
Local $aNames[3] = ["Type", "Name", "Path"]
Local $aValue[3] = ["Folder", $oSubFolder.Name, _
$oSubFolder.ParentFolder.Path]
$oRs.AddNew($aNames, $aValue)
EndIf
__Rec_Folders_Files_RecordSet($oRs, $oSubFolder, $Folders, $Files)
Next
; Parcours des fichiers
If $Files Then
For $oFile In $oFolder.Files
Local $aNames[3] = ["Type", "Name", "Path"]
Local $aValue[3] = ["File", $oFile.Name, _
$oFile.ParentFolder.Path]
$oRs.AddNew($aNames, $aValue)
Next
EndIf
EndFunc
$Timer = TimerInit()
Local $aAr = Folders_Files_Array__2D($Path)
ConsoleWrite("Version Array (" & $aAr[0][0] & " rows) en ms: " & TimerDiff($Timer) & @LF)
_ArrayDisplay($aAr, "Liste des fichier RS: " & $aAr[0][0] & " rows", -1, 0, "", "|", "iRow|Type|Name|Path")
Func Folders_Files_Array__2D($Path, $iReturn = 0)
Local $oFSO = ObjCreate("Scripting.FileSystemObject")
If Not $oFSO.FolderExists($Path) Then Return SetError(1, 1, "")
; on Initialise le Tableau pour la sortie version Array
Local $aListe[1][3] = [[0, "", $Path]]
Local $oFolder = $oFSO.GetFolder($Path)
Switch $iReturn
Case 2 ; Folders only
__Rec_Folders_Files_Array__2D($aListe, $oFolder, True, False)
Case 1 ; Files only
__Rec_Folders_Files_Array__2D($aListe, $oFolder, False, True)
Case Else ; Both
__Rec_Folders_Files_Array__2D($aListe, $oFolder)
EndSwitch
$oFSO = 0
; on fait un trie simple du tableau, et on l'affiche on enlèvera ces lignes ici c'est pour la démo
_ArraySort($aListe, 1, 1, 0, 0)
Return $aListe ; Tableau créer par la fonction
EndFunc
Func __Rec_Folders_Files_Array__2D(ByRef $aAr, ByRef $oFolder, $Folders = True, $Files = True)
If $Folders Then ReDim $aAr[UBound($aAr) + $oFolder.SubFolders.Count][4]
; Parcours des dossiers
For $oSubFolder In $oFolder.SubFolders
If $Folders Then
$aAr[0][0] += 1
$aAr[$aAr[0][0]][0] = "Folder"
$aAr[$aAr[0][0]][1] = $oSubFolder.Name
$aAr[$aAr[0][0]][2] = $oSubFolder.ParentFolder.Path
EndIf
__Rec_Folders_Files_Array__2D($aAr, $oSubFolder, $Folders, $Files)
Next
; Parcours des fichiers
If $Files Then
ReDim $aAr[UBound($aAr) + $oFolder.Files.Count][4]
For $oFile In $oFolder.Files
$aAr[0][0] += 1
$aAr[$aAr[0][0]][0] = "File"
$aAr[$aAr[0][0]][1] = $oFile.Name
$aAr[$aAr[0][0]][2] = $oFile.ParentFolder.Path
Next
EndIf
EndFunc