OVH Cloud OVH Cloud

Trier une collection de fichiers ?

6 réponses
Avatar
Machaon
Bonjour à tous,

j'utilise le code suivant pour lister les fichiers d'un dossier et tout
marche très bien :
===========================
Set Fso = CreateObject("scripting.filesystemobject")
Set Folder = Fso.GetFolder(Chemin)
Set Files = Folder.Files
For Each File In Files
MsgBox File.Name
Next
===========================

Mais mes fichiers ne sont pas triès alphabétiquement, comment puis-je
rémedier à ce pb ?

Merci bcp !

6 réponses

Avatar
Zoury
Salut! :O)

Set Fso = CreateObject("scripting.filesystemobject")



Si tu ne travailles pas en VB Script, je te déconseilles fortement
l'utilisation du FSO.
http://faq.vb.free.fr/index.php?question6


Voici un exemple utilisant les fonctions built-in de VB :
'***
' Module1
Option Explicit

Private Sub Main()

Dim sFiles() As String
Dim i As Long

sFiles = GetFiles("c:windowssystem", "*.dll")
Call QuickSortStringsAscending(sFiles, LBound(sFiles), UBound(sFiles))
For i = 0 To UBound(sFiles)
Debug.Print sFiles(i)
Next i

End Sub

' Path : un chemin valide se terminant par ""
' Pattern : un filtre valide sur le(s) type(s) de ficher(s) à trouver
' Return : un tableau de nom de fichier contenu dans le répertoire
Private Function GetFiles(ByRef Path As String, Optional ByRef Pattern As
String = "*.*") As String()

Dim sFiles() As String ' tableau de noms de fichier
Dim sFile As String ' nom du fichier actuel
Dim lLastIndex As Long ' dernier index utilisé du tableau
Const BUFFER As Long = 50 ' buffer pour le tableau

' on créer un buffer suffisament pour éviter
' de redimensionner le tableau souvent
' ça accélère de beaucoup le temps traitement
ReDim sFiles(BUFFER) As String
' trouve le premier fichier
sFile = Dir$(Path & Pattern)
' boucle tant qu'il y a des fichiers
Do Until LenB(sFile) = 0
' on ajoute le fichier au tableau
sFiles(lLastIndex) = Path & sFile
' on incrémente le compteur du tableau
lLastIndex = lLastIndex + 1
' si le compteur à atteint la limite du
' tableau, on redimensionne se dernier
If (lLastIndex > UBound(sFiles)) Then
ReDim Preserve sFiles(lLastIndex + BUFFER) As String
End If
' passe au prochain fichier
sFile = Dir$
Loop

' on tronque le surplus d'espace
ReDim Preserve sFiles(lLastIndex - 1) As String
' on renvoit le tableau
GetFiles = sFiles

End Function

Public Sub QuickSortStringsAscending(sarray() As String, inLow As Long, inHi
As Long)

Dim pivot As String
Dim tmpSwap As String
Dim tmpLow As Long
Dim tmpHi As Long

tmpLow = inLow
tmpHi = inHi

pivot = sarray((inLow + inHi) / 2)

While (tmpLow <= tmpHi)

While (sarray(tmpLow) < pivot And tmpLow < inHi)
tmpLow = tmpLow + 1
Wend

While (pivot < sarray(tmpHi) And tmpHi > inLow)
tmpHi = tmpHi - 1
Wend

If (tmpLow <= tmpHi) Then
tmpSwap = sarray(tmpLow)
sarray(tmpLow) = sarray(tmpHi)
sarray(tmpHi) = tmpSwap
tmpLow = tmpLow + 1
tmpHi = tmpHi - 1
End If

Wend

If (inLow < tmpHi) Then Call QuickSortStringsAscending(sarray(), inLow,
tmpHi)
If (tmpLow < inHi) Then Call QuickSortStringsAscending(sarray(), tmpLow,
inHi)

End Sub
'***

La fonction QuickSort à été prise sur le site de Randy :
http://vbnet.mvps.org/code/sort/qsvariations.htm


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Zoury
j'ai fait un peu de "refactoring"... (je n'était pas satisfait faut
croire..)

Quand il n'y pas de fichier trouvé par Dir$, on dimensionne le tableau avec
un tableau vide à l'aide de :
'***
sFiles = Split("", " ")
'***

Cela permet d'appeler UBound() et LBound() sans obtenir d'erreur..
'***
Option Explicit

Private Sub Main()

Dim sFiles() As String
Dim i As Long
Dim lLowerBound As Long
Dim lUpperBound As Long

sFiles = GetFiles("c:windowssystem", "*.tmp")
lLowerBound = LBound(sFiles)
lUpperBound = UBound(sFiles)
' vérifie si le tableau n'est pas vide...
If (lLowerBound < lUpperBound) Then
' il ne l'est pas, on trie!
Call QuickSortStringsAscending(sFiles, lLowerBound, lUpperBound)
End If
For i = 0 To lUpperBound
Debug.Print sFiles(i)
Next i

End Sub

'Private Function GetFiles(ByRef Path As String, Optional ByRef Pattern As
String = "*.*") As String()

Dim sFiles() As String ' tableau de noms de fichier
Dim sFile As String ' nom du fichier actuel
Dim lLastIndex As Long ' dernier index utilisé du tableau
Const BUFFER As Long = 50 ' buffer pour le tableau

sFile = Dir$(Path & Pattern)
If (LenB(sFile) > 0) Then
ReDim sFiles(BUFFER) As String
Do Until LenB(sFile) = 0
sFiles(lLastIndex) = Path & sFile
lLastIndex = lLastIndex + 1
If (lLastIndex > UBound(sFiles)) Then
ReDim Preserve sFiles(lLastIndex + BUFFER) As String
End If
sFile = Dir$
Loop
ReDim Preserve sFiles(lLastIndex - 1) As String
Else
sFiles = Split("", " ")
End If

GetFiles = sFiles

End Function
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Machaon
Merci bcp Zoury.

Le fait est que je bosse en VBScript et que le FSO me renvoi une collection
de fichiers et pas un tableau de string.
En plus, il doit bien y avoir un moyen de trier une collection facilement
sans obtenir un tableau en sortie, de façon à toujours utiliser :
"For Each File in Files"
et pareil pour les dossier.

merci pour cette réponse



"Zoury" a écrit dans le message de
news:%
Salut! :O)

> Set Fso = CreateObject("scripting.filesystemobject")

Si tu ne travailles pas en VB Script, je te déconseilles fortement
l'utilisation du FSO.
http://faq.vb.free.fr/index.php?question6


Voici un exemple utilisant les fonctions built-in de VB :
'***
' Module1
Option Explicit

Private Sub Main()

Dim sFiles() As String
Dim i As Long

sFiles = GetFiles("c:windowssystem", "*.dll")
Call QuickSortStringsAscending(sFiles, LBound(sFiles), UBound(sFiles))
For i = 0 To UBound(sFiles)
Debug.Print sFiles(i)
Next i

End Sub

' Path : un chemin valide se terminant par ""
' Pattern : un filtre valide sur le(s) type(s) de ficher(s) à trouver
' Return : un tableau de nom de fichier contenu dans le répertoire
Private Function GetFiles(ByRef Path As String, Optional ByRef Pattern As
String = "*.*") As String()

Dim sFiles() As String ' tableau de noms de fichier
Dim sFile As String ' nom du fichier actuel
Dim lLastIndex As Long ' dernier index utilisé du tableau
Const BUFFER As Long = 50 ' buffer pour le tableau

' on créer un buffer suffisament pour éviter
' de redimensionner le tableau souvent
' ça accélère de beaucoup le temps traitement
ReDim sFiles(BUFFER) As String
' trouve le premier fichier
sFile = Dir$(Path & Pattern)
' boucle tant qu'il y a des fichiers
Do Until LenB(sFile) = 0
' on ajoute le fichier au tableau
sFiles(lLastIndex) = Path & sFile
' on incrémente le compteur du tableau
lLastIndex = lLastIndex + 1
' si le compteur à atteint la limite du
' tableau, on redimensionne se dernier
If (lLastIndex > UBound(sFiles)) Then
ReDim Preserve sFiles(lLastIndex + BUFFER) As String
End If
' passe au prochain fichier
sFile = Dir$
Loop

' on tronque le surplus d'espace
ReDim Preserve sFiles(lLastIndex - 1) As String
' on renvoit le tableau
GetFiles = sFiles

End Function

Public Sub QuickSortStringsAscending(sarray() As String, inLow As Long,


inHi
As Long)

Dim pivot As String
Dim tmpSwap As String
Dim tmpLow As Long
Dim tmpHi As Long

tmpLow = inLow
tmpHi = inHi

pivot = sarray((inLow + inHi) / 2)

While (tmpLow <= tmpHi)

While (sarray(tmpLow) < pivot And tmpLow < inHi)
tmpLow = tmpLow + 1
Wend

While (pivot < sarray(tmpHi) And tmpHi > inLow)
tmpHi = tmpHi - 1
Wend

If (tmpLow <= tmpHi) Then
tmpSwap = sarray(tmpLow)
sarray(tmpLow) = sarray(tmpHi)
sarray(tmpHi) = tmpSwap
tmpLow = tmpLow + 1
tmpHi = tmpHi - 1
End If

Wend

If (inLow < tmpHi) Then Call QuickSortStringsAscending(sarray(), inLow,
tmpHi)
If (tmpLow < inHi) Then Call QuickSortStringsAscending(sarray(),


tmpLow,
inHi)

End Sub
'***

La fonction QuickSort à été prise sur le site de Randy :
http://vbnet.mvps.org/code/sort/qsvariations.htm


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/




Avatar
Zoury
> Le fait est que je bosse en VBScript et que le FSO me renvoi une


collection
de fichiers et pas un tableau de string.



ok! mais à moins d'être fou, je crois que le Folder.Files te renvoit déjà
les fichiers triés alphabétiquement, non ? c'est du moins le comportement
que j'obtiens ici..

exemple de résultats :
0.log
AcrobatSetupStatus.ini
actsetup.log
bootstat.dat
Bulles de savon.bmp
clock.avi
COM+.log
comsetup.log
control.ini
dahotfix.log
dasetup.log
desktop.ini
DIIUnin.dat
DIIUnin.exe
DIIUnin.pif
DirectX.log
DtcInstall.log
explorer.exe
explorer.scf
FaxSetup.log
frontpg.ini

et ça continue jusqu'à z suivit de _ ...

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Machaon
Et bien, non, pas chez moi, l'affichage des données n'est clairement pas
dans l'ordre alphab !

Je suis passé par un tableau temporaire que je trie facilement et ça marche
bien.

Merci Zoury.

"Zoury" a écrit dans le message de
news:
> Le fait est que je bosse en VBScript et que le FSO me renvoi une
collection
> de fichiers et pas un tableau de string.

ok! mais à moins d'être fou, je crois que le Folder.Files te renvoit déjà
les fichiers triés alphabétiquement, non ? c'est du moins le comportement
que j'obtiens ici..

exemple de résultats :
0.log
AcrobatSetupStatus.ini
actsetup.log
bootstat.dat
Bulles de savon.bmp
clock.avi
COM+.log
comsetup.log
control.ini
dahotfix.log
dasetup.log
desktop.ini
DIIUnin.dat
DIIUnin.exe
DIIUnin.pif
DirectX.log
DtcInstall.log
explorer.exe
explorer.scf
FaxSetup.log
frontpg.ini

et ça continue jusqu'à z suivit de _ ...

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/




Avatar
Zoury
reSalut!

Et bien, non, pas chez moi, l'affichage des données n'est clairement pas
dans l'ordre alphab !



J'imagine que c'est là une démonstration des différents problèmes relier à
FSO...

pourrais-tu, svp, me donner les informations de version de ta scrrun.dll ?
(elle est dans le répertoire système)
j'aimerais bien investiguer un peu à ce sujet..

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/