Parcours de sous-dossier en VB

gorgotha Messages postés 16 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 25 octobre 2011 - 7 déc. 2004 à 16:16
barley Messages postés 107 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 28 janvier 2010 - 8 déc. 2004 à 17:58
D'abord bonjour...!

je suis en train de développer une visionneuse d'image, avec l'option d'inclure les sous-dossiers...
J'arrive à afficher les fichiers d'un dossier dans un FileListBox, mais j'arrive pas a afficher les fichiers contenus dans TOUS les sous-dossiers... si qq1 peut m'aider, ce serait cool!

J'ai récupéré qq sources, mai c jamai ce que je veu, et ca m'aide pas. Faites vite! merci

12 réponses

l0st3d Messages postés 205 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 13 novembre 2009
7 déc. 2004 à 17:23
Salut, je cé pas si le code que jvais te donner est le bon pour toi
Tk, Il utilise le FileSystemObject du Microsoft Scripting runtime

donc dans un module

Public FS as FileSystemObject
public Fold as Folder
public SubFolders(1 to 100) as string 'Va contenir les sous-dossier
public SubFoldersCount as integer 'Contien le nombre de sous-dossier

public sub GetSubFolder(Basefolder as string)
dim sFolder as Folder
set fs = new FileSystemObject
set fold = fs.getfolder(BaseFolder)
for each sFolder in Fold.subfolder
'Perso je vérifi toujours si le repertoire existe vraiment
if fs.folderexist(sfolder.path) = True then
subfolder(subfoldercount+1)=sfolder.path
subfoldercount = subfoldercount +1
end if
next
end sub

voila j'espere que sa va t'etre utile
0
barley Messages postés 107 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 28 janvier 2010
7 déc. 2004 à 17:50
ce que tu veux , c'est afficher tous les fichiers contenus dans un dossier racine. si j'ai bien compris ce que tu veux, essaye ca:

Private Sub form_load()
Set fs3 = CreateObject("Scripting.FileSystemObject")
Set f3 = fs3.getFolder("c:\windows")
Set fc3 = f3.SubFolders
For Each f13 In fc3
Set fc4 = f13.Files
For Each f14 In fc4
List1.AddItem f14.Name
Next
Next
End Sub

ici, le dossier de départ est c:\windows
tous les fichiers contenus dans (ce dossier et ces sous-dossiers) figurent dans le listbox
bonne continuation
0
gorgotha Messages postés 16 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 25 octobre 2011
8 déc. 2004 à 09:26
Merci de m'avoir répondu.

Barley, tout code m'intéresse, j'pense avoir compris le principe, mai comme je suis du genre curieux, a vouloir tout comprendre, explik moi ce que signifie "Scripting.FileSystemObject". C'est quoi au juste?
et pkoi tu nomme t dossiers et ss dossiers f3 et fc3?
Par contre jcompren pas ce que c que "f13", tu l'a déclaré nul part...tout comme "f14"...

Stp, tu peux m'expliker pour chaque ligne ce que tu fais? ca m'aidera bcp. jte remercie
0
barley Messages postés 107 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 28 janvier 2010
8 déc. 2004 à 10:31
Je dois avouer que j'ai joué le faineant sur ce coup-ci, je m'épate moi même, y a du laissé aller...

voici le code avec un peu plus d'explications et surtout, un peu plus correct...lol

Private Sub form_load()
Set objet = CreateObject("Scripting.FileSystemObject") 'ceci déclare un objet qui permettra par la suite de créer des classes
Set dossier = objet.getFolder("c:\windows") 'déclare l'objet dossier comme étant c:\windows
Set sousdossiers = dossier.SubFolders 'déclare la liste des sous-dossiers de c:\windows
For Each sousdossier In sousdossiers ' pour chaque sous-dossier de cette liste de sous-dossiers
'List1.AddItem f13.Name
Set fichiers = sousdossier.Files 'déclare la liste des fichiers de ce sous-dossier
For Each fichier In fichiers 'pour chaque fichier de cette liste de fichiers
List1.AddItem fichier.Name 'ajoute le nom de ce fichier au listbox
Next 'fichier suivant de la liste des fichiers
Next ' sous-dossier suivant de la liste des sous-dossiers
End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gorgotha Messages postés 16 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 25 octobre 2011
8 déc. 2004 à 10:49
Jte remercie pour tes explications, c un peu plus clair. lool

Mais, tu ne t'ai pas trompé pour le "f13" (List1.AddItem f13.Name)???

et ici ausi :(ligne 13) "For Each fichier In fichiers"? ce serait pas plutot "For Each fichier In sousdossiers"?

Mais je me trompe peut etre aussi...jsuis pas un as non plus!

Merci quan meme ;)
0
barley Messages postés 107 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 28 janvier 2010
8 déc. 2004 à 11:06
pour le list1.additem f13.name, c'est effectivement une erreur mais ca n'empechera pas ton programme de fonctionner car c'est seulement un commentaire (')
ceci est dû au fait que le code que je t'ai envoyé servait aussi au départ à écrire tous les fichiers mais aussi tous les sous-dossiers dans le listbox et je ne l'ai pas modifier ici (f13 -->sousdossier)
or si j'ai bien saisi, toi, tu n'as besoin que des fichiers, c'est pour cela que je l'ai mis en commentaire, tu n'as qu'a effacer la ligne.

pour la ligne 13, non, je ne pense pas que je me sois trompé, le mieux, c'est d'essayer, tu regarde le résultat...

normalement, ca doit marcher, moi, j'ai testé avec c:\windows, ca semble marcher écrit ainsi.
0
gorgotha Messages postés 16 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 25 octobre 2011
8 déc. 2004 à 11:10
ok, bon, alors excuse moi d'avoir douter de ton talent!!! :shy)

La, je suis pas chez moi, mais jessairai ce soir dès que jrentre...lol!

jte remercie.
0
barley Messages postés 107 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 28 janvier 2010
8 déc. 2004 à 11:29
erreur de ma part, ca ne marche pas...
j'ai fait une petite modif, mais en fait, ca marche toujours pas...
décidemment

Private Sub form_load()
Set objet = CreateObject("Scripting.FileSystemObject") 'ceci déclare un objet qui permettra par la suite de créer des classes
Set dossier = objet.getFolder("c:\windows") 'déclare l'objet dossier comme étant c:\windows
Set sousdossiers = dossier.SubFolders 'déclare la liste des sous-dossiers de c:\windows
For Each sousdossier In sousdossiers ' pour chaque sous-dossier de cette liste de sous-dossiers
Set fichiers = sousdossier.Files 'déclare la liste des fichiers de ce sous-dossier
For Each fichier In fichiers 'pour chaque fichier de cette liste de fichiers
List1.AddItem fichier.Name 'ajoute le nom de ce fichier au listbox
Next 'fichier suivant de la liste des fichiers
Next ' sous-dossier suivant de la liste des sous-dossiers
Set fichiersdudossier = dossier.Files
For Each fichierdudossier In fichiersdudossier
List1.AddItem fichierdudossier.Name
Next
End Sub

le problème, même modifié ainsi est qu'il en fait que jusqu'a la deuxieme couche de sous-dossier
0
gorgotha Messages postés 16 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 25 octobre 2011
8 déc. 2004 à 12:03
on peut pas compter le nombre de sous dossiers dans chak sous dossiers, et faire un décompte pour chaque sous dossiers?
0
barley Messages postés 107 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 28 janvier 2010
8 déc. 2004 à 16:46
J'ai eu du mal, mais je viens de finir un code qui, cette fois-ci, marche. c'est pas du super beau code, mais ca marche, cette fois, c'est certain... à toi de voir si c'est pas trop lourd, sinon, essaye de l'ameliorer...j'ai mis toutes les explications du code.
Il y a une partie qui a été conçue par crenaud76, je vais pas réinventer ce qui a déja été fait, c'est pour attendre la fin d'éxecution d'un programme. Si ca va toujours pas, dis le moi.

'module de crenaud76 pour la fonction shellwait qui permet d'attendre la fin de l'execution avant de continuer la lecture du code
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Const STILL_ACTIVE = &H103
Private Const PROCESS_QUERY_INFORMATION = &H400

Public Sub ShellWait(ByVal JobToDo As String)
Dim hProcess As Long, RetVal As Long

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, vbMinimizedNoFocus))
Do
GetExitCodeProcess hProcess, RetVal
DoEvents
Sleep 100
Loop While RetVal = STILL_ACTIVE
End Sub

Private Sub main()

'A initialisation et variables

Dim compteur, compteurlettres, textline, textinv, lettre, nomfichier, objet, objetfichier, fichiersource
compteur = 0 ' initialisation du compteur de lignes
lettre = " " 'initialisation de la lettre
fichiersource = "c:\result.txt"

'B éxécution de la commande DOS qui écrira tous les fichiers d'un dossier et de ces sous-dossiers dans un fichier source
ShellWait "cmd.exe /c dir /A-D /S /O:N /B c:\windows >" & fichiersource 'execute commande DOS et stop la suite du programme tant que la commande DOS n'est pas terminée
Load Form1 ' charge la form
Form1.Show 'montre la form


'C module de récupération des données du fichier source vers le listbox
'C1 module d'ouverture du fichier
Open fichiersource For Input As #1 ' Ouvre le fichier source.
Do While Not EOF(1) ' Effectue la boucle jusqu'à la fin du fichier source.
Line Input #1, textline ' Lit la ligne dans la variable.
textinv = StrReverse(textline) ' inverse les caractères du texte de la ligne en cours
compteurlettres = 1 'initialisation du compteur de lettre à 1

'C2 module de scrutation des lettres jusqu'à obtention du caractère ""
Do While lettre <> "" 'tant que la lettre est différente de ""
lettre = Mid(textinv, compteurlettres, 1) ' on regarde la lettre
compteurlettres = compteurlettres + 1 ' on incrémente le compteur qui fera changer de lettre
Loop ' relance la boucle des lettres

'C3 module d'écriture
If lettre = "" Then 'si la lettre est bien maintenant "" alors
nomfichierinv = Mid(textinv, 1, compteurlettres - 2) 'on prend le nom du fichier qui est encore a l'envers
Form1.List1.AddItem StrReverse(nomfichierinv) 'on affiche son nom inversé pour obtenir son veritable nom
compteur = compteur + 1 'on incrémente le compteur de ligne pour pouvoir passer a la ligne suivante
lettre = " " 'on réinitialise la lettre
End If

Loop 'relance la boucle des lignes
Close #1 ' Ferme le fichier.

'D module d'effacement du fichier source
Set objet = CreateObject("Scripting.FileSystemObject") ' crée un objet
Set objetfichier = objet.getfile(fichiersource) 'l'objet devient le fichier source
objetfichier.Delete True 'efface et force la suppression du fichier source

End Sub
0
gorgotha Messages postés 16 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 25 octobre 2011
8 déc. 2004 à 17:27
Ouaou! Bon, c vrai que ca a l'air cho... j'essairai ca ce soir, et demain, jte dirai si c bon ou pas, mais en tout cas, merci! ca fai lgtps que tu développe? et tu fai que du VB?
0
barley Messages postés 107 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 28 janvier 2010
8 déc. 2004 à 17:58
je ne developpe que depuis le debut de l'annee, je debute seulement...
j'avais fait un peu de C et d'assembleur à l'école, j'ai trouvé ça sympa donc je débute avec ce qui me semble être le commencement: VB.
C'est pour l'instant le seul langage que je connais et à mon avis, j'ai pas fini, quand je vois les réponses que certains arrivent à donner sur le site, je me sens très loin de leur niveau...
si je poursuis sur un autre langage, ce sera le C++.
A bientot.
0
Rejoignez-nous