IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Utiliser l'API FindFirstFileEx


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 143
    Points
    143
    Par défaut Utiliser l'API FindFirstFileEx
    Bonjour à tous,

    J'ai besoin de tester l'existence (ou non) d'un sous-répertoire, c'est à dire savoir si AU MOINS UN sous-répertoire existe ou non dans un dossier donné.

    Pour ça l'API FindFirstFile n'est pas très efficiente car elle ne fait pas le distingo a priori sur dossier/fichier. Sachant que le scan se fait dans un ordre aléatoire, je ne voudrais pas être obligé de scanner X fichiers avant de découvrir qu'il n'y a pas de sous-dossiers.

    Par contre j'ai découvert l'API FindFirstFileEx, mais celle-ci utilise un Enum en C (que j'ai) mais sans valeur:
    Code C/C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef enum _FINDEX_SEARCH_OPS {
        FindExSearchNameMatch,
        FindExSearchLimitToDirectories,
        FindExSearchLimitToDevices,
        FindExSearchMaxSearchOp
    } FINDEX_SEARCH_OPS
    Je crois me souvenir qu'en l'absence de valeur pour chaque item VB lui attribue un long commençant à 0.

    Ma question, quelqu'un a t'il déjà utiliser cette API en VB6 ou possède quelques notions de transposition d'une telle énumération de C vers VB. Cela me rendrait bigrement service.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    La possibilité de recherche de répertoire avec FindFirstFileEx existe mais elle dépend du système sur lequel on travaille.
    Par contre si on veut chercher des fichiers, on peut utiliser le code proposé par l'utilitaire Api-Guide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    '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
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 143
    Points
    143
    Par défaut
    Merci l_autodidacte pour ta réponse,

    Mais si je peux me permettre, elle ne répond en rien à ma question. Je connais et utilise depuis longtemps le fonctions FindFirstFile/FindNextFile, mais là, cela ne serait pas vraiment efficient.

    Désolé

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    Citation Envoyé par Calade Voir le message
    .../...
    Ma question, quelqu'un a t'il déjà utiliser cette API en VB6 ou possède quelques notions de transposition d'une telle énumération de C vers VB. Cela me rendrait bigrement service.

    Merci d'avance.
    Tu as très bien répondu par toi-même à ta question : Sous VB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum FINDEX_SEARCH_OPS
         FindExSearchNameMatch    
         FindExSearchLimitToDirectories     
         FindExSearchLimitToDevices     
         FindExSearchMaxSearchOp 
    end enum

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 143
    Points
    143
    Par défaut
    Merci DarkVader,

    Merci, j'en conclus donc que comme en VB, les enums se voient attribuer une valeur par défaut, ce qui nous donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum FINDEX_SEARCH_OPS
         FindExSearchNameMatch    
         FindExSearchLimitToDirectories     
         FindExSearchLimitToDevices     
         FindExSearchMaxSearchOp 
    end enum
    est équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum FINDEX_SEARCH_OPS
         FindExSearchNameMatch    = 0
         FindExSearchLimitToDirectories = 1    
         FindExSearchLimitToDevices     = 2
         FindExSearchMaxSearchOp = 3
    end enum
    peut être en long au lieu d'un Integer...
    ai-je raison ?
    Merci encore.

  6. #6
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    En fait sous VB l'énumération incrémente la valeur précédente
    et comme l'initialisation d'une valeur numérique est 0 ...
    on pourrait donc écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    enum FINDEX_SEARCH_OPS
          FindExSearchNameMatch   ' = 0
          FindExSearchLimitToDirectories '= 1
          FindExSearchLimitToDevices     '= 2
          FindExSearchMaxSearchOp '= 3
          FindExSearchNewVal0=7
          FindExSearchNewVal1   '=8
    'etc 
    end enum
    Les énumérations sont de type long (pour VB6 : codage sous 4octets signés)

    Tu devrais installer la MSDN (téléchargeable sur ce site)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 143
    Points
    143
    Par défaut
    Merci,
    mais j'ai déjà une version complète.
    Par contre, encore une petite question si je peux me permettre. Dans ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    enum FINDEX_SEARCH_OPS
          FindExSearchNameMatch   ' = 0
          FindExSearchLimitToDirectories '= 1
          FindExSearchLimitToDevices     '= 2
          FindExSearchMaxSearchOp '= 3
          FindExSearchNewVal0=7
          FindExSearchNewVal1   '=8
    'etc 
    end enum
    tu passes directement de la valeur 3 (pour FindExSearchMaxSearchOp) à 7 (pour FindExSearchNewVal0), qui n'est qu'un exemple, j'ai bien compris. Y a t'il une raison où est-ce juste un exemple.

    Ceci, parce que j'aime bien mettre des valeurs pour mes énumérations, cela rend le code plus lisible. Je ne voudrais donc pas faire d'erreurs si le cas se présente pour d'autres API.

    En tout cas merci encore pour tout.

  8. #8
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    C'est pour l'exemple afin de montrer que derrière la valeur ...Next0, l'énumération s'incrémente à partir de cette valeur (7+1=8 etc.) :
    - une énumération n'est pas forcément une série continue
    - c'est pratique pour écrire une énumération restreinte
    Rien ne t'empêche d'affecter chaque valeur - je pratique également ainsi pour la même raison.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 120
    Points : 143
    Points
    143
    Par défaut
    OK et merci pour tout.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [USB]Comment utiliser cette API pour la communication USB
    Par fouguasse dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 19/08/2007, 19h18
  2. [vbscript]Utilisation D'API's
    Par nek_kro_kvlt dans le forum VBScript
    Réponses: 1
    Dernier message: 02/01/2006, 21h31
  3. []Recuperer le nom d'un contact en utilisant les API msn ?
    Par trotter dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 09/10/2005, 23h07
  4. Réponses: 36
    Dernier message: 13/05/2004, 19h22
  5. Utilisation des API MySQL // ADO ou BDE ? (sujet 2)
    Par rohstev dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/11/2003, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo