begin process at 2008 07 19 08:50:40
1 212 721 membres
60 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RECHERCHER DES FICHIERS


Information sur la source

Catégorie :API Niveau : Débutant Date de création : 18/04/2003 Date de mise à jour : 18/04/2003 14:01:04 Vu : 3 581

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

Ce petit bout de code permet une recherche de fichier de recurcive en utilisant les API.
Vous y trouverai l'utilisation des fonctions suivantes :
      - FindFirstFile
      - FindNextFile
      - FindClose

Source

  • Option Explicit
  • 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 FindClose Lib "kernel32" ( _
  • ByVal hFindFile As Long) _
  • As Long
  • Private Const INVALID_HANDLE_VALUE = -1
  • Private Const MAX_PATH = 260
  • 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
  • '---------------------------------------------------------------------------------------'
  • ' Recherche de fichiers '
  • '---------------------------------------------------------------------------------------'
  • ' '
  • ' Path : chemin de départ de la recherche '
  • ' fichier : nom du fichier a rechercher '
  • ' tabfic() : tableau de retour des fichiers trouvés (avec leur chemin) '
  • '---------------------------------------------------------------------------------------'
  • Public Sub FindFile(path As String, fichier As String, tabfic() As String)
  • Dim chemin As String
  • Dim fic As String
  • Dim hfind As Long
  • Dim hfind2 As Long
  • Dim struct As WIN32_FIND_DATA
  • chemin = path
  • hfind = FindFirstFile(chemin & "*.*" & Chr(0), struct)
  • hfind2 = hfind
  • Do Until hfind2 = 0
  • If Left(struct.cFileName, 1) <> "." Then
  • fic = chemin & Left(struct.cFileName, InStr(struct.cFileName, Chr(0)) - 1)
  • Debug.Print fic
  • If struct.dwFileAttributes And vbDirectory Then FindFile fic & "\", fichier, tabfic
  • If Right(fic, Len(fichier)) = fichier Then
  • ReDim Preserve tabfic(UBound(tabfic) + 1)
  • tabfic(UBound(tabfic)) = fic
  • tabfic(0) = UBound(tabfic)
  • End If
  • End If
  • hfind2 = FindNextFile(hfind, struct)
  • Loop
  • FindClose hfind
  • End Sub
Option Explicit

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 FindClose Lib "kernel32" ( _
    ByVal hFindFile As Long) _
    As Long

Private Const INVALID_HANDLE_VALUE = -1
Private Const MAX_PATH = 260

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


'---------------------------------------------------------------------------------------'
'			Recherche de fichiers						'
'---------------------------------------------------------------------------------------'
'											'
' Path : chemin de départ de la recherche						'
' fichier : nom du fichier a rechercher							'
' tabfic() : tableau de retour des fichiers trouvés (avec leur chemin)			'
'---------------------------------------------------------------------------------------'

Public Sub FindFile(path As String, fichier As String, tabfic() As String)
    Dim chemin As String
    Dim fic As String
    Dim hfind As Long
    Dim hfind2 As Long
    Dim struct As WIN32_FIND_DATA
    
    chemin = path
    hfind = FindFirstFile(chemin & "*.*" & Chr(0), struct)
    hfind2 = hfind
    Do Until hfind2 = 0
        If Left(struct.cFileName, 1) <> "." Then
            fic = chemin & Left(struct.cFileName, InStr(struct.cFileName, Chr(0)) - 1)
            Debug.Print fic
            If struct.dwFileAttributes And vbDirectory Then FindFile fic & "\", fichier, tabfic
            If Right(fic, Len(fichier)) = fichier Then
                ReDim Preserve tabfic(UBound(tabfic) + 1)
                tabfic(UBound(tabfic)) = fic
                tabfic(0) = UBound(tabfic)
            End If
        End If
        hfind2 = FindNextFile(hfind, struct)
    Loop
    FindClose hfind
End Sub

Conclusion

Si vous trouvez des bugs ou des ameliorations a apporter, signalez les moi svp; ce source n'en sera que meilleur
  • signaler à un administrateur
    Commentaire de PROGRAMMIX le 18/04/2003 14:31:40

    Je ne voudrais pas être désagréable mais malheureusement pour toi, il y a déjà pas mal de sources traitant de la recherche récursive des fichiers via les API.

    De plus, je trouve que tu n'as pas assez commenté ton code afin de faire comprendre comment fonctionne le tout et surtout comment faire pour, par exemple, ne conserver que certains fichiers et pas d'autres.
    L'intérêt d'une recherche de fichiers étant généralement de sélectionner des fichiers répondant à certains critères.

  • signaler à un administrateur
    Commentaire de lca94 le 01/10/2003 13:21:56

    commentaire d'en haut: ben t'utilise les ? et * du dos pour dire par ex auto*.bat tous les "automachin.bat" dans le nom de fichier

    commentaire du prog: joli mais manque un truc ... tu testes comment quand tu trouves aucun fichiers? moi ça donne une erreur mon tabfic reste totalement vide ...donc pour faire simple
    j'aiajouté avant ta boucle et juste après les dim

    redim tabfic(1)
    tabfic(0)=0 'indice 0 donnant dans ton prog le nb de fichier retenus :)


    du coup si rien n'est trouvé je fait "if tanbfic(0) then"

    vla (j'ai créé un fichier existfile() en fait qui rend cette option au dessu inutile et n'apelle que le findfirst :) (le tout pour utiliser cette dernière dans excel qui m'emmerde avec les findfile et autres intégrés au logiciel ... le vba c pas génianl des fois .. faut réinstaller Excel pour avoir ci et ça... alors je kernel32 et ya pu a installer)

    ci dessous la fonction qui m'a bien aidé à partir des infos que tu m'a donné avec ton prog ... yen a surement d'autres mais c cuila que j'ai trouvé : bien sur fo mettre les truc de Declare avant :)

    Public Function ExistFile(chemin As String, fichier As String) As Boolean
    Dim tabfic() As String
        Dim hfind As Long
        Dim struct As WIN32_FIND_DATA
        
        hfind = FindFirstFile(chemin & fichier & Chr(0), struct)
        ExistFile = (hfind &lt;&gt; -1)
    End Function

  • signaler à un administrateur
    Commentaire de shayane le 07/10/2004 16:39:36

    Bein comment qu'on fait si on veut étendre la recherche dans les sous dossiers ........

  • signaler à un administrateur
    Commentaire de PROGRAMMIX le 07/10/2004 17:46:29

    Pour les sous-dossiers, on fait une rechercher récursive.

    Voir, par exemple, ma source "3 MÉTHODES DE RECHERCHE RÉCURSIVE DE FICHIERS" :
    http://www.vbfrance.com/code.aspx?id=5089.

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS