[débutant][VB]fonction récursive

Salut tout le monde,

je suis débutant en progra (c’est pas mon premier metier…). Je souhaite lister le contenu d’un répertoire (sous-répertoires/fichiers), j’utilise une fonction récursive. J’ai récuperé ce bout de code et ca marche pas trop mal en VB sous VStudio2003.

[code] oFSO = CreateObject(« Scripting.FileSystemObject »)

	'# Pointeur sur le repertoire courant
	Orepcourant = oFSO.GetFolder("c:\")

	'# Creation du fichier texte
	oFSO = CreateObject("Scripting.FileSystemObject")
	oFichierTXT = oFSO.CreateTextFile("Listing_" & Orepcourant.Name & ".txt", _
	True)

	'# Ecriture du repertoire courant dans le fichier
	oFichierTXT.WriteLine("RÉPERTOIRE SCRUTÉ : " & Orepcourant.Path)
	oFichierTXT.WriteLine("")

	'# Obtention d'une collection contenant l'ensemble des repertoire du dossier
	oSousRep = Orepcourant.SubFolders


	'# Appel d'une fonction recursive qui va lister l'ensemble des dossiers
	'# contenu dans chaque sous-dossier
	'Call listingSousDossiersRecur(oSousRep, oRepCourant.Name)
	Call listingSousDossiersRecur(oSousRep, Orepcourant.Path)
End Sub

'#Fonction recursive
Sub listingSousDossiersRecur(ByVal objListRep, ByVal cheminBranche)
	oFichierTXT.WriteLine("## Entrée dans le répertoire " & cheminBranche)

	'# Listing des fichiers
	pFichier = oFSO.GetFolder(cheminBranche)
	cFichiers = pFichier.Files

	For Each fichier In cFichiers
		oFichierTXT.WriteLine(cheminBranche & "\" & fichier.Name)
	Next

	'# Listing des sous-dossiers + appel recursif
	For Each oSousRep In objListRep
		objListSousRep = oSousRep.SubFolders
		Call listingSousDossiersRecur(objListSousRep, _
	  cheminBranche & "\" & oSousRep.Name)
	Next
End Sub[/code]

Je souhaite ajouter maintenant la possibilité de trier par date.
Exemple: faire le listing en fonction d’une date donné, lister tous les répertoires,sous-repertoires et fichiers datant de plus de deux ans.

Comment puis-je procéder ?
Si quelqu’un a une idée,
merci !

– edit –
pour la date, j’ai en partie ma réponse => propriété .DateLastModified
:stuck_out_tongue:
–edit bis–
en fait non: je souhaite désormais afficher la derniere modification effectué dans un ensemble de sous-rep…voir plus bas

Ca a un peu évolué, exit FSO…
Désormais j’ai besoin d’ afficher la date du dernier fichier modifié contenu dans un répertoire:

ma nouvelle fonction:

[code]Public Function GetLastModifiedTime(ByRef CurrDir As IO.DirectoryInfo) As Date

	Dim mostrecent As Date = #1/1/1900#
	For Each f As IO.FileInfo In CurrDir.GetFiles
		If mostrecent < f.LastWriteTime Then
			mostrecent = f.LastWriteTime
		End If
	Next

	Dim da As Date
	For Each d As IO.DirectoryInfo In CurrDir.GetDirectories
		da = GetLastModifiedTime(d)
		If mostrecent < da Then mostrecent = da
	Next
	Return mostrecent

End Function

Dim d As Date
Dim di As New IO.DirectoryInfo(tbChemin.Text)
d = GetLastModifiedTime(di)
MsgBox(d)

	Dim s As New System.Text.StringBuilder
	s.AppendFormat("Dir:{0}{1}Date:{2}", di, vbTab, d)


	Dim f As New IO.StreamWriter("c:\test.txt")
	f.WriteLine(s.ToString)
	f.Close()[/code]

Ca fonctionne, cool.
Seul problème, ma fonction remonte tout en haut (tbchemin.text que j’ai défini dans une textbox) hors ce que je voudrais c’est la dernière date de chaque sous-rep.

Comment je fais? :stuck_out_tongue:

– edit –
un petit schema peut-être:

ce que je souhaites obtenir:

[code][*]Répertoire-Racine
------------------------[Sous-Repertoire_1]–date_du_dernier_fichier_modifié

------------------------[Sous-Repertoire_2]–date_du_dernier_fichier_modifié
-----------------------------------------------[sous-sous-repertoire]–date_du_dernier_fichier_modifié
-----------------------------------------------[sous-sous-repertoire2]–date_du_dernier_fichier_modifié[/code]

Une idée? :stuck_out_tongue:

Trié par date décroissante et prendre le premier élément de la liste ?

(Juste une idée comme ça, je maitrise pas le VB)

Dieu que c’est moche le VB :stuck_out_tongue:

Je vais quand même essayer de t’aider:

  1. Renomme ta fonction récursive en « PrintLastModifiedTime », et ajoute un StreamWriter en paramètre.
  2. Après ta 1ère boucle, affiche le fichier le plus récent.
  3. Dans le corps de ta 2ème boucle, appelle simplement ta fonction récursive sur chaque sous répertoire.

Si tu veux que ce soit bien indenté, tu peux aussi passer en paramètre le niveau d’indentation (et l’incrémenter au début de la fonction)

Yes merci,

donc là j’ai changé le code, je crée un fichier text au form_load (variable fi)

et dans la seconde boucle je fais:

[code]
For Each d As IO.DirectoryInfo In CurrDir.GetDirectories
da = GetLastModifiedTime(d)
If mostrecent < da Then mostrecent = da

		' test
		fi.WriteLine(da + d.FullName)

	Next
	Return mostrecent[/code]

Et là dans mon fichier j’ai bien :

22/01/2006 19:19:28 \rep\sous-rep1 09/08/2003 11:51:00 \rep\sous-rep2\sous-sous-rep1 04/08/2005 15:35:36 \rep\sous-rep2\sous-sous-rep2 03/03/2003 10:00:00 \rep\sous-rep3\

Comment dire maintenant que je ne veux que les sous-repertoires (et pas les sous-sous-repertoires…)?
ici par exemple
date: \sous-rep1
date: \sous-rep2
date: \sous-rep3
date: \sous-repN\

:stuck_out_tongue:

Rajoute un compteur de profondeur comme paramètre, et arrête la récursion s’il dépasse un seuil (des fois que tu voudrais changer ta limite).

Le problème c’est que je dois descendre au plus bas (hum):
la date \repN doit correspondre à la date la plus récente de ses sous-rep.
par exemple:

22/01/2006 19:19:28 \rep\sous-rep1 04/08/2005 15:35:36 \rep\sous-rep2\ 09/08/2003 11:51:00 \rep\sous-rep2\sous-sous-rep1 04/08/2005 15:35:36 \rep\sous-rep2\sous-sous-rep2 03/03/2003 10:00:00 \rep\sous-rep3\

sous-rep2 a bien comme date la plus récente celle de son sous-rep le plus récent (sous-rep2).

Je suis pas sûr d’être clair :stuck_out_tongue: