[Basic] Explorer une arborescence de répertoires

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
bm92
ManitOOu
ManitOOu
Messages : 2562
Inscription : 26 nov. 2005 13:42

[Basic] Explorer une arborescence de répertoires

Message par bm92 »

Bonjour à tous,
L'instruction OOoBasic Dir permet d'explorer un répertoire. Mais elle ne peut pas être employée de manière récursive. Ceci complique l'exploration d'une arborescence (le livre Programmation OpenOffice.org 2 donne une solution, page 155).

Le service API SimpleFileAccess permet, lui, une approche récursive, et la boucle For Each disponible avec OOo 2.x simplifie un peu plus.

Le codage ci-dessous est un squelette à adapter à vos besoins.
Ici on compte les sous-répertoires et les fichiers.
En explorant C:\ sur mon PC j'ai obtenu en quelques minutes : 5517 répertoires et 70113 fichiers.

Code : Tout sélectionner

Option Explicit

' exemple : compter le nombre de sous-répertoires et le nombre total de fichiers
Private d as long, f as long

Sub Main
Dim depart As String
d= 0
f = 0
depart = ConvertToURL("C:\Docs OpenOffice\")
explorerDossier(depart)
MsgBox(d & " répertoires,   " & f & " fichiers")
End Sub


Sub explorerDossier(ByVal repEnCours As String)
Dim item As String
Dim ucb As Object, dc As Variant

ucb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
On Error GoTo accesInterdit
dc = ucb.getFolderContents(repEnCours, True)
' ici on obtient un tableau des url complètes
' de chaque fichier et chaque répertoire du répertoire en cours
' mais dans le désordre !
for each item in dc
  if ucb.IsFolder(item)  then ' traitement pour chaque sous-répertoire
    d = d+1 ' exemple : compter les sous-répertoires
    explorerDossier(item) ' récursion
  else ' traitement pour chaque fichier
    f = f+1 ' exemple : compter les fichiers
  end if
next
GoTo Exit1

accesInterdit:
Resume Exit1
Exit1:
On Error GoTo 0
End Sub
Le traitement d'erreur est déclenché sur des répertoires interdits, comme C:\System Volume Information sur Windows XP.
______
Bernard