Tous les fichiers d'un répertoires et de ses sous repertoires dans une listbox

Résolu
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
- 14 déc. 2009 à 16:07
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
- 15 déc. 2009 à 15:15
Bonjour à tous,

je souhaiterais faire apparaître tous les fichiers (en choisissant l'extension) contenu dans un dossier et dans tout ses sous dossiers, dans une listbox.
Comment faire s'il vous plaît?

Merci

Malo

14 réponses

Claiyah
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
14 déc. 2009 à 18:31
bonjour
voila un code de l'api findfirstfile qui répond à tes besoins (code pris de API guide) :

'Create a form with a command button (command1), a list box (list1)
'and four text boxes (text1, text2, text3 and text4).
'Type in the first textbox a startingpath like c:\
'and in the second textbox you put a pattern like *.* or *.txt

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Const MAX_PATH = 260
Const MAXDWORD = &HFFFF
Const INVALID_HANDLE_VALUE = -1
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type
Function StripNulls(OriginalStr As String) As String
    If (InStr(OriginalStr, Chr(0)) > 0) Then
        OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
    End If
    StripNulls = OriginalStr
End Function

Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer)
    'KPD-Team 1999
    'E-Mail: KPDTeam@Allapi.net
    'URL: http://www.allapi.net/

    Dim FileName As String ' Walking filename variable...
    Dim DirName As String ' SubDirectory Name
    Dim dirNames() As String ' Buffer for directory name entries
    Dim nDir As Integer ' Number of directories in this path
    Dim i As Integer ' For-loop counter...
    Dim hSearch As Long ' Search Handle
    Dim WFD As WIN32_FIND_DATA
    Dim Cont As Integer
    If Right(path, 1) <> "" Then path = path & ""
    ' Search for subdirectories.
    nDir = 0
    ReDim dirNames(nDir)
    Cont = True
    hSearch = FindFirstFile(path & "*", WFD)
    If hSearch <> INVALID_HANDLE_VALUE Then
        Do While Cont
        DirName = StripNulls(WFD.cFileName)
        ' Ignore the current and encompassing directories.
        If (DirName <> ".") And (DirName <> "..") Then
            ' Check for directory with bitwise comparison.
            If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                dirNames(nDir) = DirName
                DirCount = DirCount + 1
                nDir = nDir + 1
                ReDim Preserve dirNames(nDir)
            End If
        End If
        Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
        Loop
        Cont = FindClose(hSearch)
    End If
    ' Walk through this directory and sum file sizes.
    hSearch = FindFirstFile(path & SearchStr, WFD)
    Cont = True
    If hSearch <> INVALID_HANDLE_VALUE Then
        While Cont
            FileName = StripNulls(WFD.cFileName)
            If (FileName <> ".") And (FileName <> "..") Then
                FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
                FileCount = FileCount + 1
                List1.AddItem path & FileName
            End If
            Cont = FindNextFile(hSearch, WFD) ' Get next file
        Wend
        Cont = FindClose(hSearch)
    End If
    ' If there are sub-directories...
    If nDir > 0 Then
        ' Recursively walk into them...
        For i = 0 To nDir - 1
            FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "", SearchStr, FileCount, DirCount)
        Next i
    End If
End Function
Sub Command1_Click()
    Dim SearchPath As String, FindStr As String
    Dim FileSize As Long
    Dim NumFiles As Integer, NumDirs As Integer
    Screen.MousePointer = vbHourglass
    List1.Clear
    SearchPath = Text1.Text
    FindStr = Text2.Text
    FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
    Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories"
    Text4.Text "Size of files found under " & SearchPath & " " & Format(FileSize, "#,###,###,##0") & " Bytes"
    Screen.MousePointer = vbDefault
End Sub
3
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
14 déc. 2009 à 16:49
Bonjour,

Le choix d'une Listbox n'est peut-être pas le plus heureux à cette fin-là ...
Un contrôle TreeView serait plus indiqué, notamment si tu dois ensuite choiisir un fichier (car une listbox t'obligerait alors à y inscriore, pour chaque article, le chemin complet).


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
1
14 déc. 2009 à 16:56
Et auriez vous une solution pour remplir un treeview de tous les fichiers contenu dans un dossiers et dans ces sous dossiers avec la possibilité de choisir le pattern? svp

Malo
0
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
1
14 déc. 2009 à 17:06
en fait je ne veux pasle chemin complet du fichiers mais jsute son nom+extension
merci

Malo
0

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

Posez votre question
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
14 déc. 2009 à 17:32
Voilà avec un contrôle Treeview (à ajouter en le selectionnant dans tes composants complémentaires)



Private Sub CommandButton1_Click()
   Dim p As String, filtre As String
   TreeView1.Nodes.Clear
   p "e:\monoutil" ' <<<<< ici ton repertoire
   filtre = "*.txt" ' <<<<<==== ici ton filtre
   Set tvn = TreeView1.Nodes.Add(, tvwParent, p, p)
   fouille p, filtre
End Sub

Sub fouille(ByVal rep As String, ByVal filtre As String)
   Dim fic As String, nbfic As Integer, strTempPath As String, i As Integer
   If Right$(rep, 1) <> "" Then rep = rep & ""
   fic = Dir$(rep, vbDirectory)
   nbfic = 1
   Do While fic <> ""
       If fic <> "." And fic <> ".." Then
           strTempPath = rep & fic
           If GetAttr(strTempPath) And vbDirectory Then
               Set tvn = TreeView1.Nodes.Add(rep, tvwChild, strTempPath + "", fic)
               fouille strTempPath, filtre
               fic = Dir$(rep, vbDirectory)
               For i = 2 To nbfic
                   fic = Dir$
               Next
           Else
               If fic Like filtre Then
                 Set tvn = TreeView1.Nodes.Add(rep, tvwChild, strTempPath, fic)
               End If
           End If
       End If
       fic = Dir$
       nbfic = nbfic + 1
   Loop
End Sub


Clique ensuite sur les noeuds de la treeview et tu verras
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
1
14 déc. 2009 à 20:15
Merci Claiyah!
Cela me va très bien.

Ucfoutu :
vb me met une erreur à cette ligne :
Set tvn = TreeView1.Nodes.Add(, tvwParent, p, p)

je n'ai pas encore regarder pour moi

Merci à tous les deux !

Malo
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
14 déc. 2009 à 20:20
cela veut probablement dire que tu n'as pas inséré de contrôle Treeview sur ta form
Et alors, évidemment ...
Pour ton information : j'ai testé ce code chez moi avant de te le communiquer ===>>> aucun problème : tout fonctionne bien
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Claiyah
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
15 déc. 2009 à 10:12
si le répertoire que tu va parcourir est grand et que tu cherche par exemple *.* je te conseil d'ajouter "Doevents" pour que sa bug pas
0
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
1
15 déc. 2009 à 11:01
Pourtantj'avais créer un TreeView nommé TreeView1. Je ressayerai.

Claiyah, je suis débutant et ne maitrise pas trop le DoEvents. ou dois-je le rajouter car efectivement pour de grosse recherche il me met un dépassement de capacité.

Merci

Malo
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
15 déc. 2009 à 11:13
Je crois avoir deviné ce qui t'arrive : tu as déclaré Op^tion Explicit et deux variables ne sont pas définies ...
ajoute ceci sous la ligne (tout en ghaut) disant option explicit :

Option Explicit
Private tvn As Object, tvwparent As Object
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
1
15 déc. 2009 à 11:27
Effectivement ca marche.
Mais j'avaoue que la solution de Claiyah me convient mieu car je sors mon resultat dans une listbox.
Merci quand même pour le treeview qui pourra me servir pour autre chose.


Malo
0
Claiyah
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
15 déc. 2009 à 11:52
daccord je vais te refaire le code avec un listview et pas un treeview puis je te le donne
0
Claiyah
Messages postés
580
Date d'inscription
mercredi 20 août 2008
Statut
Membre
Dernière intervention
20 avril 2010
3
15 déc. 2009 à 12:10
re
donc créer un nouveau projet avec un listview nomé "lv1" et deux textbox "text1" et "text2" et command1 et met ce code dans ton form:

Option Explicit
'Create a form with a command button (command1), a list box (list1)
'and four text boxes (text1, text2, text3 and text4).
'Type in the first textbox a startingpath like c:\
'and in the second textbox you put a pattern like *.* or *.txt

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Const MAX_PATH = 260
Const MAXDWORD = &HFFFF
Const INVALID_HANDLE_VALUE = -1
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type
Function StripNulls(OriginalStr As String) As String
    If (InStr(OriginalStr, Chr(0)) > 0) Then
        OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
    End If
    StripNulls = OriginalStr
End Function

Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer)
    'KPD-Team 1999
    'E-Mail: KPDTeam@Allapi.net
    'URL: http://www.allapi.net/

    Dim FileName As String ' Walking filename variable...
    Dim DirName As String ' SubDirectory Name
    Dim dirNames() As String ' Buffer for directory name entries
    Dim nDir As Integer ' Number of directories in this path
    Dim i As Integer ' For-loop counter...
    Dim hSearch As Long ' Search Handle
    Dim WFD As WIN32_FIND_DATA
    Dim Cont As Integer
    If Right(path, 1) <> "" Then path = path & ""
    ' Search for subdirectories.
    nDir = 0
    ReDim dirNames(nDir)
    Cont = True
    hSearch = FindFirstFile(path & "*", WFD)
    If hSearch <> INVALID_HANDLE_VALUE Then
        Do While Cont
        DirName = StripNulls(WFD.cFileName)
        ' Ignore the current and encompassing directories.
        If (DirName <> ".") And (DirName <> "..") Then
            ' Check for directory with bitwise comparison.
            If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                dirNames(nDir) = DirName
                DirCount = DirCount + 1
                nDir = nDir + 1
                ReDim Preserve dirNames(nDir)
            End If
        End If
        Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
        Loop
        Cont = FindClose(hSearch)
    End If
    ' Walk through this directory and sum file sizes.
    hSearch = FindFirstFile(path & SearchStr, WFD)
    Cont = True
    If hSearch <> INVALID_HANDLE_VALUE Then
        While Cont
            FileName = StripNulls(WFD.cFileName)
            If (FileName <> ".") And (FileName <> "..") Then
                FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
                FileCount = FileCount + 1
                'List1.AddItem path & FileName
                Dim pos As Long
                If lv1.ListItems.Count < 1 Then pos 1 Else pos lv1.ListItems.Count
                
                lv1.ListItems.Add pos, , FileName
                lv1.ListItems(pos).ListSubItems.Add , , path
                DoEvents
            End If
            Cont = FindNextFile(hSearch, WFD) ' Get next file
        Wend
        Cont = FindClose(hSearch)
    End If
    ' If there are sub-directories...
    If nDir > 0 Then
        ' Recursively walk into them...
        For i = 0 To nDir - 1
            FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "", SearchStr, FileCount, DirCount)
            DoEvents
        Next i
    End If
End Function
Sub Command1_Click()
Dim NumFiles As Integer, NumDirs As Integer
Dim SearchPath As String, FindStr As String
lv1.ListItems.Clear
SearchPath = Text1.Text
FindStr = Text2.Text
Screen.MousePointer = vbHourglass
FindFilesAPI SearchPath, FindStr, NumFiles, NumDirs

End Sub


Private Sub Form_Load()
lv1.View = lvwReport
lv1.ColumnHeaders.Add 1, , "Nom du Fichier", 3000
lv1.ColumnHeaders.Add 2, , "Chemin du fichier", lv1.Width - 3000
End Sub


j'espère que sa va résoudre ton problème
à plus
0
malo777
Messages postés
88
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
13 juin 2013
1
15 déc. 2009 à 15:15
Ok merci beaucoup.
Ce code me va nickel.

A+ sur vbFrance & bonne continuation.

Malo
0