Pb avec une fonction recursive

Greg -  
 Greg -
Bonjour tout le monde
J'ai un problème avec une fonction : je reçois un message d'erreur ,à l'instruction "nomFichier = dir" ,me disant "argument ou appel de procédure incorrect"
Je vous remercie d'avance pour votre aide

'Cette fonction calcule le nombre de fichiers que contient un repertoire
'et la taille de celui-ci en octets

Function ContenuRepertoire(repertoire)

Dim result() As DetailRepertoire
nomFichier = Dir(repertoire)
Do While nomFichier <> ""
y = y + 1
taille = FileLen("e:\temp\" & nomFichier)
c = c + taille
'appel de la fonction pour voir si nomFichier contient
'd'autres fichiers
result() = ContenuRepertoire(nomFichier)
nomFichier = Dir
Loop
ReDim Preserve result(1)
result(1).NbreFichiers = y
result(1).TailleRep = c
ContenuRepertoire = result()

End Function
A voir également:

7 réponses

geronimhurl
 
1 fois tu fais ça:
nomFichier = Dir(repertoire)
et 1 autre tu fais ça:
nomFichier = Dir

c'est un peu pas trop possible que tu mettes 2 types différents dans une seule variable.
A moins qu'il y ait des surcharges en VB (c'est bien du VB ?)
0
MarsuGL
 
C'est correct en vb de rapeller la fonction dir sans parametres comme il fais; mais alors c pas gagné parce que c'est le seul truc qui va dans ce code.

je vasi t'écrire la fonction.
Je doute qu'il y ait besoin d'utilsier la récursivité pour cela, et puis c'esté délicat en vb la récursivité.

Quelques remarques en vrac :
Function ContenuRepertoire(repertoire)
RQ : une fonction retourne un type, un parametre en a un aussi sonon c'est un variant et c'est a éviter quand on le peux
Ex: Function ContenuRepertoire(StrRepertoire as string) as DetailRepertoire
----------------------
taille = FileLen("e:\temp\" & nomFichier)
pas conseillé de coder en dur et puis qu'est ce que c'est que ce chemin??

bon, ok pour la récursivité, c'est pour aller voir dans les répertoires si il y a d'autres fichiers..
Laisse moi un jour ou deux, je vais essayer de te faire ca, c'est intéressant.
0
Greg
 
Alors MarsuGl ,t'as tjs pas trouvé la solution !?!
0
MarsuGL
 
salut greg,
Je ne pense pas qu'il y ait de solution récursive a ce probleme en vb
pourquoi? :
Vb dans les versions anterieures a .net ne semble pas disposer de fonctions permettant de sauvegarder l'état de la pile; du genre de push() et pop() en C;
Cela veut dire que qu'une fonction s'apelle soi meme, mais quand il s'agit de remonter a la fonction apellante, il n'est pas possible de restaurer la pile dans l'etait qu'elle etais, donc, il y a plantage sur la fonction dir.

J'essaie de voir une solution sans récursivité.
0
Greg
 
En tout cas ,c'est cool de ta part t'ocupper de mon pb
0

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

Posez votre question
MarsuGL
 
Voila, Sur un autre forum, qqn m'a mis sur la bonne piste (ne pas utiliser le dir mais l'objet fileSysthem) et je t'ai écris un module.
Ce n'est pas parfait, mais ca devrais t'etre utile.

______dans un nouveau module____________________________
'structure contenant les informations sur le repêrtoire scanné
Public Type infos 'les nom des variables parlent d'eux memes
nbfichiers As Long
taillefichiers As Long
nbrep As Long
End Type

Public Function Init(ByRef StrucInit As infos, path As String, ByRef folder As Object) As String
Dim FileSystem As Object
Set FileSystem = CreateObject("Scripting.FileSystemObject")
Set folder = FileSystem.GetFolder(path)

StrucInit.nbfichiers = 0
StrucInit.taillefichiers = 0
StrucInit.nbrep = 0

End Function

Private Sub LstFichiers(ByRef Dossier As Object, ByRef StructInfo As infos, debugmode As Integer)
Dim Fichiers, Fichier As Object

Set Fichiers = Dossier.Files
For Each Fichier In Fichiers
DoEvents ' laisse la main a l'os pour affichage
StructInfo.nbfichiers = StructInfo.nbfichiers + 1
StructInfo.taillefichiers = StructInfo.taillefichiers + FileLen(Fichier)
If debugmode = 2 Then
Debug.Print Fichier
End If
Next
End Sub

Function LstDossier(ByVal DossierParent As Object, PremierPassage As Boolean, ByRef minfos As infos, debugmode As Integer) As infos
' degubmode=0 : pas d'affichage
' =1 : les repertoires
' =2 : les fichiers
' le tout dans la fenetre de débug de vb

Dim SousDossier As Object
Dim MonSousDossier As Object

'================liste les fichiers du rep de départ====
If PremierPassage = True Then ' si c'est le premier appel a la fonction
Call LstFichiers(DossierParent, minfos, debugmode)
End If
'=======================================================

Set SousDossier = DossierParent.subfolders
For Each MonSousDossier In SousDossier 'pour chaque sous rep..
DoEvents
minfos.nbrep = minfos.nbrep + 1

If debugmode = 1 Then
Debug.Print MonSousDossier
End If

'================liste les fichiers du sous repertoire==
Call LstFichiers(MonSousDossier, minfos, debugmode)
'=======================================================

minfos = LstDossier(MonSousDossier, False, minfos, debugmode) 'appel de soi meme
' la structure info retournée va remplacer celle passée a la fonc
Next

LstDossier = minfos ' retourne la structure avec les infos
End Function
______________________________________________

______le code suivant est un exemple d'appel de la fonction_____

Dim chemin As String
Dim mesinfos As infos ' type de structure déclaré public dans le module
Dim folder As Object

chemin = "c:\mes documents" ' remplacer par le chemin a tester

Call Init(mesinfos, chemin, folder) 'fonction d'initialisation
mesinfos = LstDossier(folder, True, mesinfos, 2) 'tout se fait ici

MsgBox "Fichiers: " & mesinfos.nbfichiers & vbCrLf & "Taille : " & mesinfos.taillefichiers & vbCrLf & "Repertoires : " & mesinfos.nbrep
__________________________________________________

Voila, ce n'est pas parfait, ni super bien commenté, mais demande moi si besoin d'explications

Tu remarquera dans le code des instructions Debug.Print.
Je les ai mises pour te montrer comment avoir acces aux noms des repertoires et fichier scannés.
remplacer ce debug.print par par exemple :
list1.additem ... permet d'afficher dans une listbox les noms de fichiers ou/et de repertoire en cours mais ce n'est pas ce que j'apellerais une programmation propre et actuellement, la fonction est totalement indépendente du reste de l'appli; et tu n'auras aucune erreur qui te dis qu'il te manque une textbox ou autre composant sur ta feuille.
D'un autre coté, si on afficher le nom des fichiers et etre correct en programmation, il faudrait creer un tableau qui :
1) serait remplit avec tout les noms de fichiers
2) afficher ce tableau. et sur mon ordi un scan de c:\ prend plusieurs minutes a s'executer alors quelle solution est la bonne?? a toi de voir.

Un autre probleme qui se pose est qu'un controle listbox a des limites, on ne peux pas lui faire creer des lignes a l'infini; ce chiffre est grand mais chez moi il y avais plus de fichiers sur c: que ce que la listbox pouvais supporter; a voir avec les autres controles..

Je ne sais toujours pas pourquoi le dir provoquait une erreur dans ton programme de départ.

Dominique
0
MarsuGL
 
j'aiajouté le source sur vb france et un projet de démo
http://www.vbfrance.com/article.aspx?Val=4865
0
Greg
 
Salut Dominique,
Merci bcp de ton aide
0