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 848

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
 

Commentaires et avis

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



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.