Numéro d'article: 185476 - Dernière mise à jour: lundi 31 août 2009 - Version: 4.0

Comment faire pour les répertoires de recherche pour rechercher ou liste des fichiers

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.

Sommaire

Agrandir tout | Réduire tout

Résumé

Lorsque vous recherchez des fichiers, il est souvent nécessaire effectuer une recherche dans les sous-répertoires. Cet article illustre deux méthodes de recherche des répertoires et d'extraction des informations de fichier de manière récursive.

Plus d'informations

Alors que Visual Basic fournit des méthodes pour récupérer des informations sur les fichiers et les répertoires, vous pouvez également utiliser les fonctions Windows API pour ces tâches. À l'aide de l'API n'est pas plus rapide que les méthodes intégrées, mais les deux méthodes fonctionnent un peu différemment. Par conséquent, cet article explique les deux techniques pour extraire les informations de cette. Si vous testez les deux méthodes, essayez d'utiliser le même chemin de départ et la chaîne de recherche. Vous devriez obtenir des résultats similaires.

Notez que les exemples suivants n'incluent pas de récupération d'erreur complet mais méthode 2 intercepte un cas particulier où la fonction VB GetAttr() échoue sur Pagefile.sys, ce qui est le fichier d'échange de mémoire virtuelle Windows NT. En outre, en fonction de la chaîne de recherche, la version de l'API répertorie et compte les noms de répertoire par défaut, où la version de Visual Basic n'est pas le cas. Notez que les exemples suivants n'incluent pas de récupération d'erreur complet mais méthode 2 intercepte un cas particulier où la fonction VB GetAttr() échoue sur Pagefile.sys, ce qui est le fichier d'échange de mémoire virtuelle Windows NT. La seule différence dans les résultats entre ces deux méthodes est que le code Visual Basic ne retourne pas le fichier Créer dates.

Méthode 1: Utilisation de l'API Windows

  1. Démarrez un nouveau projet standard EXE dans Visual Basic. Form1 est créé par défaut.
  2. Ajoutez un bouton de commande nommé Command1, le quatre zones de texte nommés le Texte1, Texte2, Texte3 et Texte4 et un contrôle ListBox à Form1.
  3. Ajouter un module dans le menu projets et insérer le texte suivant :
       Declare Function FindFirstFile Lib "kernel32" Alias _
       "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData _
       As WIN32_FIND_DATA) As Long
    
       Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" _
       (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    
       Declare Function GetFileAttributes Lib "kernel32" Alias _
       "GetFileAttributesA" (ByVal lpFileName As String) As Long
    
       Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) _
       As Long
    
       Declare Function FileTimeToLocalFileTime Lib "kernel32" _
       (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
         
       Declare Function FileTimeToSystemTime Lib "kernel32" _
       (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
    
       Public Const MAX_PATH = 260
       Public Const MAXDWORD = &HFFFF
       Public Const INVALID_HANDLE_VALUE = -1
       Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
       Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
       Public Const FILE_ATTRIBUTE_HIDDEN = &H2
       Public Const FILE_ATTRIBUTE_NORMAL = &H80
       Public Const FILE_ATTRIBUTE_READONLY = &H1
       Public Const FILE_ATTRIBUTE_SYSTEM = &H4
       Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
    
       Type FILETIME
         dwLowDateTime As Long
         dwHighDateTime As Long
       End Type
    
       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
    
       Type SYSTEMTIME
         wYear As Integer
         wMonth As Integer
         wDayOfWeek As Integer
         wDay As Integer
         wHour As Integer
         wMinute As Integer
         wSecond As Integer
         wMilliseconds As Integer
       End Type
    
       Public 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
    					
  4. Copiez le code suivant dans le module de Form1 :
       Option Explicit
    
       Function FindFilesAPI(path As String, SearchStr As String, _
        FileCount As Integer, DirCount As Integer)
       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
       Dim FT As FILETIME
       Dim ST As SYSTEMTIME
       Dim DateCStr As String, DateMStr As String
         
       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)
                   ' Uncomment the next line to list directories
                   'List1.AddItem path & FileName
                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 <> "..") And _
                  ((GetFileAttributes(path & FileName) And _
                   FILE_ATTRIBUTE_DIRECTORY) <> FILE_ATTRIBUTE_DIRECTORY) Then
                FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * _
                 MAXDWORD) + WFD.nFileSizeLow
                FileCount = FileCount + 1
                ' To list files w/o dates, uncomment the next line
                ' and remove or Comment the lines down to End If
                'List1.AddItem path & FileName
                
               ' Include Creation date...
               FileTimeToLocalFileTime WFD.ftCreationTime, FT
               FileTimeToSystemTime FT, ST
               DateCStr = ST.wMonth & "/" & ST.wDay & "/" & ST.wYear & _
                  " " & ST.wHour & ":" & ST.wMinute & ":" & ST.wSecond
               ' and Last Modified Date
               FileTimeToLocalFileTime WFD.ftLastWriteTime, FT
               FileTimeToSystemTime FT, ST
               DateMStr = ST.wMonth & "/" & ST.wDay & "/" & ST.wYear & _
                  " " & ST.wHour & ":" & ST.wMinute & ":" & ST.wSecond
               List1.AddItem path & FileName & vbTab & _
                  Format(DateCStr, "mm/dd/yyyy hh:nn:ss") _
                  & vbTab & Format(DateMStr, "mm/dd/yyyy hh:nn:ss")
              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
    
       Private 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
    					
  5. Exécutez le projet. Entrez un chemin de départ dans Texte1, une chaîne de recherche dans Texte2 (tels que *. * ou *.txt), puis cliquez sur Command1.
Vous verrez une liste des fichiers trouvés affichage dans la zone de liste avec la date de création et la date de dernière modification, le nombre réel de fichiers trouvées affiche dans Texte3 et la taille totale des fichiers qui que se trouvent sous le répertoire de départ s'affiche dans Texte4.

Méthode 2: Utilisation des fonctions intégrées de Visual Basic

Ces instructions build sur le préalable décrit exemple mais peuvent également être utilisées dans un nouveau projet.
  1. Ouvrez le projet à l'aide de la procédure décrite dans Method1
  2. Ajoutez un autre bouton de commande intitulé Command2, le deux zones de texte plus nommés le Texte5 et Texte6 et un autre contrôle ListBox, liste 2, à Form1.
  3. Copiez le code suivant dans le module de Form1 :
       Function FindFiles(path As String, SearchStr As String, _
           FileCount As Integer, DirCount As Integer)
          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.
    
          On Error GoTo sysFileERR
          If Right(path, 1) <> "\" Then path = path & "\"
          ' Search for subdirectories.
          nDir = 0
          ReDim dirNames(nDir)
          DirName = Dir(path, vbDirectory Or vbHidden Or vbArchive Or vbReadOnly _
    Or vbSystem)  ' Even if hidden, and so on.
          Do While Len(DirName) > 0
             ' Ignore the current and encompassing directories.
             If (DirName <> ".") And (DirName <> "..") Then
                ' Check for directory with bitwise comparison.
                If GetAttr(path & DirName) And vbDirectory Then
                   dirNames(nDir) = DirName
                   DirCount = DirCount + 1
                   nDir = nDir + 1
                   ReDim Preserve dirNames(nDir)
                   'List2.AddItem path & DirName ' Uncomment to list
                End If                           ' directories.
       sysFileERRCont:
             End If
             DirName = Dir()  ' Get next subdirectory.
          Loop
    
          ' Search through this directory and sum file sizes.
          FileName = Dir(path & SearchStr, vbNormal Or vbHidden Or vbSystem _
          Or vbReadOnly Or vbArchive)
          While Len(FileName) <> 0
             FindFiles = FindFiles + FileLen(path & FileName)
             FileCount = FileCount + 1
             ' Load List box
             List2.AddItem path & FileName & vbTab & _
                FileDateTime(path & FileName)   ' Include Modified Date
             FileName = Dir()  ' Get next file.
          Wend
    
          ' If there are sub-directories..
          If nDir > 0 Then
             ' Recursively walk into them
             For i = 0 To nDir - 1
               FindFiles = FindFiles + FindFiles(path & dirNames(i) & "\", _
                SearchStr, FileCount, DirCount)
             Next i
          End If
    
       AbortFunction:
          Exit Function
       sysFileERR:
          If Right(DirName, 4) = ".sys" Then
            Resume sysFileERRCont ' Known issue with pagefile.sys
          Else
            MsgBox "Error: " & Err.Number & " - " & Err.Description, , _
             "Unexpected Error"
            Resume AbortFunction
          End If
          End Function
    
          Private Sub Command2_Click()
          Dim SearchPath As String, FindStr As String
          Dim FileSize As Long
          Dim NumFiles As Integer, NumDirs As Integer
    
          Screen.MousePointer = vbHourglass
          List2.Clear
          SearchPath = Text1.Text
          FindStr = Text2.Text
          FileSize = FindFiles(SearchPath, FindStr, NumFiles, NumDirs)
          Text5.Text = NumFiles & " Files found in " & NumDirs + 1 & _
           " Directories"
          Text6.Text = "Size of files found under " & SearchPath & " = " & _
          Format(FileSize, "#,###,###,##0") & " Bytes"
          Screen.MousePointer = vbDefault
          End Sub
    
       Private Sub Form_Load()
          Command1.Caption = "Use API code"
          Command2.Caption = "Use VB code"
          ' start with some reasonable defaults
          Text1.Text = "C:\My Documents\"
          Text2.Text = "*.*"
       End Sub
    					
  4. Exécutez le projet. Entrez un chemin de départ dans Texte1, une chaîne de recherche dans Texte2 (tels que *. * ou monfichier?.txt, et ainsi de suite), puis cliquez sur Command2.
Vous pouvez voir une liste des fichiers trouvés apparaissent dans la liste 2 avec la date de dernière modification, le nombre de fichiers trouvées dans Texte5, de la taille totale des fichiers se trouve sous le répertoire de départ dans Texte6. En combinant ces deux méthodes sur un formulaire, vous pouvez vérifier que les deux méthodes retournent des informations de correspondance.

Méthode 3: Utiliser l'objet FileSystem avec Visual Basic

Pour informations sur l'utilisation de FileSystemObject avec Visual Basic à rechercher ou liste fichiers, consultez l'article suivant dans la base de connaissances Microsoft :
185601  (http://support.microsoft.com/kb/185601/EN-US/ ) Comment faire pour les répertoires de recherche de manière récursive à l'aide de FileSystemObject

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic 5.0 Édition initiation
  • Microsoft Visual Basic 6.0 Édition initiation
  • Microsoft Visual Basic 5.0 Édition professionnelle
  • Microsoft Visual Basic 6.0 Édition professionnelle
  • Microsoft Visual Basic 5.0 Édition Entreprise
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Édition Standard
  • Microsoft Visual Basic 4.0 Édition professionnelle
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
Mots-clés : 
kbmt kbapi kbhowto KB185476 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 185476  (http://support.microsoft.com/kb/185476/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.