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

Excel Discussion :

Enumération fichiers sur serveur FTP


Sujet :

Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Enumération fichiers sur serveur FTP
    Bonjour à tous,
    Je reviens une nouvelle fois vers vous car je n'arrive pas à résoudre mon problème...
    J'ai sur un poste faisant office de serveur FTP, toutes les factures qui ont été éditées. Ces factures sont stockées sur le serveur dans le répertoire C:\FTP\AncFRE.
    Je parviens à télécharger et à envoyer des fichiers via FtpGetFile et FtpPutFile mais je souhaiterai récupérer tout le contenu de C:\FTP\AncFRE pour le stocker en local dans le répertoire C:\FTP\PDF.
    J'ai bien sûr entendu parler de FtpFindFirstFile et de InternetFindNextFile mais je n'arrive pas à les mettre en pratique pour mon "cas".
    Je vous joins le code déja élaboré pour une meilleure compréhension:
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
     
    Option Explicit
     
    Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _
        ByVal hInternetSession As Long, ByVal sServerName As String, _
        ByVal nServerPort As Integer, ByVal sUsername As String, _
        ByVal sPassword As String, ByVal lService As Long, _
        ByVal lFlags As Long, ByVal lContext As Long) As Long
     
    Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" ( _
        ByVal sAgent As String, ByVal lAccessType As Long, _
        ByVal sProxyName As String, _
        ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
     
    Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias _
        "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, _
        ByVal lpszDirectory As String) As Boolean
     
    Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" ( _
        ByVal hConnect As Long, _
        ByVal lpszRemoteFile As String, _
        ByVal lpszNewFile As String, _
        ByVal fFailIfExists As Long, _
        ByVal dwFlagsAndAttributes As Long, _
        ByVal dwFlags As Long, _
        ByRef dwContext As Long) As Boolean
     
    Public Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" ( _
        ByVal hFtpSession As Long, _
        ByVal lpszLocalFile As String, _
        ByVal lpszRemoteFile As String, _
        ByVal dwFlags As Long, _
        ByVal dwContext As Long) As Boolean
     
    Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _
                    (ByVal hConnect As Long, ByVal lpszSearchFile As String, _
                     ByRef lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, _
                     ByVal dwContext As Long) As Long
     
    Public Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _
                    (ByVal hFind As Long, ByRef lpvFindData As String) As Boolean
     
    Public Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" ( _
        ByVal hFtpSession As Long, _
        ByVal lpszFileName As String) As Boolean
     
    Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
     
    Public Const MAX_PATH = 260
    Type WIN32_FIND_DATA
            dwFileAttributes As Long
            ftCreationTime As Currency
            ftLastAccessTime As Currency
            ftLastWriteTime As Currency
            nFileSizeHigh As Long
            nFileSizeLow As Long
            dwReserved0 As Long
            dwReserved1 As Long
            cFileName As String * MAX_PATH
            cAlternate As String * 14
    End Type
     
     
    Public CheminFRE, CheminPDF, CheminPDFServeur, FichierFRE, FichierPDF, IP, MDP, Path As String
    Public vAn As Integer
    Public bin_asc, Mode As Variant
    Public Internet_OK, FTP_OK, Sélect_rép As Integer
    Public Succès As Boolean
    Public Result As WIN32_FIND_DATA
     
     
    ' Détermine si le dossier FTP existe
    Function DossierExiste(NomDossier As String) As Boolean
        DossierExiste = Dir(NomDossier, vbDirectory) <> ""
    End Function
     
    ' Pour Télécharger FRE depuis serveur
    Sub Téléchargement_Fichier()
    vAn = Format(Now, "yyyy")
     
    If DossierExiste("C:\FTP\") = False Then
        MkDir "C:\FTP\"
    End If
     
    Select Case MsgBox("Etes-vous à votre domicile pour vous connecter sur le serveur ?", vbYesNo, vbQuestion)
        Case vbYes
            IP = "192.168.X.X"
        Case vbNo
            IP = "81.XX.XXX.XXX"
    End Select
     
    ' Mot de passe Accès Serveur
    Do While MDP <> "XXXXXX"
    MDP = InputBox("Mot de passe ?", "Accès serveur")
    If MDP <> "XXXXXX" Then
        MsgBox "Ce n'est pas le bon mot de passe..."
    End If
    Loop
     
    FichierFRE = "FRE vierge Année " & vAn & ".xlsm"
    CheminFRE = "C:\FTP\" + FichierFRE
     
    Internet_OK = InternetOpen("", 1, "", "", 0)
    If Internet_OK Then
        FTP_OK = InternetConnect(Internet_OK, IP, 21, "XXXX", "XXXXXX", 1, 0, 0)
        If FtpSetCurrentDirectory(FTP_OK, "\") Then
            Succès = FtpGetFile(FTP_OK, CheminFRE, CheminFRE, False, 0, &H0, 0)
            Succès = FtpDeleteFile(FTP_OK, CheminFRE)
        End If
    End If
     
    If Succès Then
        MsgBox "Le fichier " + FichierFRE + " a été télécharger depuis le serveur !"
    Else
        MsgBox ("Le fichier '" + FichierFRE + "' n'a pas été trouvé !")
    End If
     
    Workbooks.Open FileName:=CheminFRE
     
    ' Arrêt connection serveur
    InternetCloseHandle FTP_OK
    InternetCloseHandle Internet_OK
    End Sub
     
     
    ' Pour Envoyer FRE vierge et PDF vers serveur
    Sub Envoie_Fichier()
     
    If DossierExiste("C:\FTP\") = False Then
        MsgBox "Pas de fichiers à transférer..." & vbLf & vbLf & "Veuillez télécharger la FRE vierge depuis le serveur !", "Transfert Fichiers"
        Exit Sub
    End If
    vAn = Format(Now, "yyyy")
     
    FichierFRE = "FRE vierge Année " & vAn & " test" & ".xlsm"
    CheminFRE = "C:\FTP\" + FichierFRE
    Path = "C:\FTP\*.pdf"
    FichierPDF = Dir(Path)
     
    Internet_OK = InternetOpen("", 1, "", "", 0)
    If Internet_OK Then
        FTP_OK = InternetConnect(Internet_OK, IP, 21, "XXXX", "XXXXXX", 1, 0, 0)
        If FtpSetCurrentDirectory(FTP_OK, "\") Then
            Succès = FtpPutFile(FTP_OK, CheminFRE, FichierFRE, 1, 0)
            'Succès = FtpPutFile(FTP_OK, CheminPDF, CheminPDFServeur, 1, 0)
     
            While FichierPDF <> ""
                'Path = "C:\FTP\*.pdf"
                CheminPDF = "C:\FTP\" + FichierPDF
                CheminPDFServeur = "C:\FTP\PDF\" + FichierPDF
                Succès = FtpPutFile(FTP_OK, CheminPDF, CheminPDFServeur, 1, 0)
                FichierPDF = Dir
            Wend
        End If
    End If
     
    If Succès Then
        MsgBox "Les fichiers ont bien été transférés sur le serveur ", , "Transfert FTP"
    Else
        MsgBox "Serveur non accessible..." & vbLf & vbLf & "Veuillez appeler la maintenance au XX XX XX XX XX !", vbExclamation, "Erreur Transfert Fichiers"
    End If
     
    ' Arrêt connection serveur
    InternetCloseHandle FTP_OK
    InternetCloseHandle Internet_OK
     
    ' Suppresion des fichiers
    Kill ("C:\FTP\*.*")
    End Sub
     
    ' Pour editer anciennes FRE
    Sub EditionFRE()
    If DossierExiste("C:\FTP\AncFRE") = False Then
        MkDir "C:\FTP\AncFRE"
    End If
     
    Select Case MsgBox("Etes-vous à votre domicile pour vous connecter sur le serveur ?", vbYesNo, vbQuestion)
        Case vbYes
            IP = "192.168.X.X"
        Case vbNo
            IP = "81.XX.XXX.XXX"
    End Select
     
    Path = "C:\FTP\PDF\*.pdf"
    FichierPDF = Dir(Path)
    Internet_OK = InternetOpen("", 1, "", "", 0)
    If Internet_OK Then
        FTP_OK = InternetConnect(Internet_OK, IP, 21, "XXXX", "XXXXXXXX", 1, 0, 0)
        If FtpSetCurrentDirectory(FTP_OK, "C:\FTP\PDF\") Then
     
           ???
     
     
        End If
    End If
     
    ' Arrêt connection serveur
    InternetCloseHandle FTP_OK
    InternetCloseHandle Internet_OK
     
    End Sub
    Par avance, merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Personne n'a trouvé un début de solution ou mon "cas" n'intéresse personne ?

    Une petite question au passage...
    Quand on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim var1, var2 As String
    Est-ce que cela déclare les deux variables en String ou seulement var2, la première étant donc déclarée par défaut en Variant ???

    Merci

  3. #3
    Membre éclairé Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Points : 879
    Points
    879
    Par défaut
    bonjour STRIKER94,

    tu as tout bon, le 1er est variant, désolé si je ne puis t'aider pour ton 1er probleme.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse sabizzz !
    Donc il faut impérativement un Dim pour chaque variable ou il existe un moyen de déclarer plusieurs variables de même type en une seule fois ?

    Je continue à chercher pour mon premier problème...

    Bonne soirée

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim A as string, B as string, C as integer, D as boolean
    sur une seule ligne. Pas forcément très propre, mais cela fonctionne...

    Pour le premier problème, je vais tester mon ftp, si j'arrive à faire fonctionner quelque chose

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Ok merci !

    je continue mes recherches de mon côté...

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Après quelques tests, je te propose ceci...

    1) La structure de ton type WIN32_FIND_DATA n'est pas correcte, à mon avis. Voici une structure qui fonctionne. Remarque qu'elle utilise un deuxième type personnalisé
    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
    Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End Type
     
    ' FINDFILE Structure
    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
        cAlternateFileName As String * 13
    End Type
    2) La déclaration de InternetFindNextFile n'est pas correcte. En deuxième paramètre, tu dois utiliser une variable as WIN32_FIND_DATA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _
                    (ByVal hFind As Long, ByRef lpvFindData As WIN32_FIND_DATA) As Boolean
    3) Lors de la tentative de connexion, j'ai dû adapter le mode du FTP et forcer le mode passif, à savoir la valeur 134217728 (h8000000) de façon à ne pas devoir modifier les paramètres du pare-feu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hFTP = InternetConnect(hInternet, Serveur, 21, Utilisateur, MotDePasse, 1, 134217728, 0)
    Voici un code qui permet de récupérer d'un dossier défini la liste des fichiers et dossiers correspondant à un pattern. Par défaut, le dossier est la racine du site ftp et le pattern est "*.*". Il faudra, si je ne dis pas de bêtises, adapter le "/" en "\" pour les serveurs Windows.

    La fonction ListeFichiers renvoie la collection des fichiers et dossiers trouvés, la deuxième donnée, après le ";" étant le type de l'élément récupéré (16 = dossier, 128 = fichier)

    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
    Sub RecupererListeFichiers()
      Dim pFichiers As Collection
     
      Set pFichiers = ListeFichiers("MonServeurFTP.com", "moi", "MonMotDePasse")
    End Sub
     
    Function ListeFichiers(Serveur As String, Utilisateur As String, MotDePasse As String, _
      Optional Dossier As String = "/", Optional Fichiers As String = "*.*") As Collection
      ' Liste les fichiers et dossiers du dossier passé en paramètres
     
      Dim pData As WIN32_FIND_DATA
      Dim hInternet As Long, hFTP As Long, hPremier As Long, hSuivant As Long
      Dim pFichiers As New Collection
      Dim NomFichier As String
     
      pData.cFileName = String(MAX_PATH, 0)
     
      hInternet = InternetOpen("", 1, vbNullString, vbNullString, 0)
      If hInternet <> 0 Then
        hFTP = InternetConnect(hInternet, Serveur, 21, Utilisateur, MotDePasse, 1, 134217728, 0)
        If hFTP <> 0 Then
          If FtpSetCurrentDirectory(hFTP, Dossier) Then
            hPremier = FtpFindFirstFile(hFTP, Fichiers, pData, 0, 0)
            If hPremier <> 0 Then
              NomFichier = Left(pData.cFileName, _
                InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
              pFichiers.Add NomFichier & ";" & pData.dwFileAttributes
              hSuivant = 1
              Do While hSuivant <> 0
                pData.cFileName = String(MAX_PATH, 0)
                hSuivant = InternetFindNextFile(hPremier, pData)
                If hSuivant <> 0 Then
                  NomFichier = Left(pData.cFileName, _
                    InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
                  pFichiers.Add NomFichier & ";" & pData.dwFileAttributes
                End If
              Loop
            End If
          End If
        End If
      End If
      Set ListeFichiers = pFichiers
     
      InternetCloseHandle hSuivant
      InternetCloseHandle hPremier
      InternetCloseHandle hFTP
      InternetCloseHandle hInternet
    End Function
    Une procédure récursive pour récupérer une arborescence complète n'est à mon sens pas envisageable, au vu du temps d'exécution ( Une proc récursive met plus de 2 minutes pour lire l'arborescence de mon domaine sur DVP... ). La raison en est qu'il faut créer un handle de connexion pour chaque dossier dès lors que l'on a tenté de récupérer le premier élément d'un dossier, ce qui allonge évidemment le temps d'exécution. ll semble préférable de récupérer le contenu dossier par dossier, au fur et à mesure des besoins.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci à toi pour le temps que tu as consacré à mon "problème"...
    Je vais adapter ton code et tester tout ça et te montrerai le résultat !

    J'aurai cependant quelques questions afin de mieux comprendre...

    Quelle différence entre mode passif et mode passif ?
    A quoi sert la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set ListeFichiers = pFichiers
    Bonne soirée
    @+

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Mode passif: C'est le client ftp qui initialise la connexion, le serveur ftp se mettant à l'écoute du client.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ListeFichiers = pFichiers
    La fonction ListeFichiers renvoie une collection.

    Au sein de la fonction, la collection pFichiers est alimentée par les noms de fichiers renvoyés du serveur. Cette ligne transfère la collection privée pFichiers, interne à la fonction, à la fonction elle-même. Elle permet à la fonction de retourner la collection au code appelant.

    Dans certains langages, c'est la ligne Return ... qui remplit ce rôle

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Ok, mais comment "lister" les fichiers qu'elle contient ?

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    C'est dans la procédure que tu peux lister les fichiers

    Ici, je les envoie via debug.print, mais tu peux alimenter un treeview, une liste, une plage de cellules, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub RecupererListeFichiers()
      Dim pFichiers As Collection
      Dim SiteFTP As String, Utilisateur As String, MotDePasse As String
      Dim i As Long
     
      SiteFTP = "monsite.com"
      Utilisateur = "moi"
      MotDePasse = "MonPDW"
      Set pFichiers = ListeFichiers(SiteFTP, Utilisateur, MotDePasse)
     
      For i = 1 To pFichiers.Count
        Debug.Print pFichiers(i)
      Next i
    End Sub

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    J'ai adapté ton code ainsi:
    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
    Sub RecupererListeFichiers()
    Dim pFichiersPDF As Collection
     
    If DossierExiste("C:\FTP\AncFRE") = False Then
        MkDir "C:\FTP\AncFRE"
    End If
     
    Select Case MsgBox("Etes-vous à votre domicile pour vous connecter sur le serveur DI2S ?", vbYesNo, vbQuestion)
        Case vbYes
            IP = "192.168.X.X"
        Case vbNo
            IP = "81.XX.XXX.XXX"
    End Select
     
    Set pFichiersPDF = ListeFichiers(IP, "XXXX", "XXXXXXX")
    End Sub
     
    Function ListeFichiers(Serveur As String, Utilisateur As String, MotDePasse As String, _
      Optional CheminPDFServeur As String = "\PDF", Optional FichiersPDF As String = "*.pdf") As Collection
      ' Liste les fichiers et dossiers du dossier passé en paramètres
     
      Dim pData As WIN32_FIND_DATA
      Dim hPremier As Long, hSuivant As Long
      Dim pFichiersPDF As New Collection ' Pour les fichiers PDF contenus dans C:\FTP\PDF sur le serveur
      Dim FichierPDF As String ' Pour le nom du PDF téléchargé sur le serveur
     
      pData.cFileName = String(MAX_PATH, 0)
     
      Internet_OK = InternetOpen("", 1, vbNullString, vbNullString, 0)
      If Internet_OK <> 0 Then
        FTP_OK = InternetConnect(Internet_OK, IP, 21, "XXXX", "XXXXXXX", 1, 0, 0)
        If FTP_OK <> 0 Then
          If FtpSetCurrentDirectory(FTP_OK, CheminPDFServeur) Then
            hPremier = FtpFindFirstFile(FTP_OK, FichiersPDF, pData, 0, 0)
            If hPremier <> 0 Then
              FichierPDF = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
              pFichiersPDF.Add FichierPDF & ";" & pData.cFileName
              Succès = FtpGetFile(FTP_OK, FichierPDF, "C:\FTP\AncFRE\" & FichierPDF, False, 0, &H8000000, 0)
              hSuivant = 1
              Do While hSuivant <> 0
                pData.cFileName = String(MAX_PATH, 0)
                hSuivant = InternetFindNextFile(hPremier, pData)
                If hSuivant <> 0 Then
                    FichierPDF = Left(pData.cFileName, _
                    InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
                    pFichiersPDF.Add FichierPDF & ";" & pData.cFileName
                    Succès = FtpGetFile(FTP_OK, FichierPDF, "C:\FTP\AncFRE\" & FichierPDF, False, 0, &H8000000, 0)
                End If
              Loop
            End If
          End If
        End If
      End If
      Set ListeFichiers = pFichiersPDF
      InternetCloseHandle hSuivant
      InternetCloseHandle hPremier
      InternetCloseHandle FTP_OK
      InternetCloseHandle Internet_OK
    End Function
    J'ai rajouté un FtpGetFile...

    Qu'en penses-tu ?

    Ma solution fonctionne aussi... Laquelle est la meilleure ???

    En tout cas, merci beaucoup ! Grace à toi, j'ai réussi en adoptant ton code, à faire ce que je souhaitais !

    Bon dimanche à toi

    Cordialement,

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Il n'y en a pas une meilleure que l'autre. Ma fonction ne fait que renvoyer une liste de fichiers présents dans un dossier. La tienne, en plus, les télécharge.

    De ce que je lis de ton code, tu n'utilises à aucun momemt la collection des noms d'objets renvoyée par la fonction et tu souhaites juste récupérer les pdf.

    Dans ce cas, tu n'es pas obligé d'alimenter la collection, ni même d'utiliser une fonction qui la renvoie (sauf si tu souhaites garder une trace des fichiers que tu as téléchargés).

    Quoi qu'il en soit, tant mieux si cela fonctionne.

    Bon dimanche

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Bonjour,
    Oui en fait, je m'étais mal exprimé dès le départ...
    Je souhaitais juste télécharger tous les PDF contenus dans le répertoire sur le serveur !

    Puisque je n'utilise pas la collection des noms d'objets renvoyée par ta fonction, quelles sont lignes qui ne me servent pas et que je peux donc supprimer sans risquer que cela me plante tout ???

    @+

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Dans la procédure Sub RecupererListeFichiers()


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set pFichiersPDF = ListeFichiers(IP, "XXXX", "XXXXXXX")
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeFichiers IP, "XXXX", "XXXXXXX"
    La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Function ListeFichiers(Serveur As String, Utilisateur As String, MotDePasse As String, _
      Optional Dossier As String = "/", Optional Fichiers As String = "*.*") As Collection
    devient une procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sub ListeFichiers(Serveur As String, Utilisateur As String, MotDePasse As String, _
      Optional Dossier As String = "/", Optional Fichiers As String = "*.*")
    et le End Function devient End Sub

    A l'intérieur de cette procédure, tu peux supprimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Dim pFichiers As New Collection
    les deux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              pFichiers.Add NomFichier & ";" & pData.dwFileAttributes
    et la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set ListeFichiers = pFichiers
    Je pense n'avoir rien oublié

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Encore merci pour ton aide qui m'a permis d'arriver, "par détournement", à obtenir ce que je désirai...
    Je vais apporter les modifications dont tu me fais part !

    @+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/05/2011, 20h06
  2. Envoi de fichier sur serveur FTP distant
    Par red_dog dans le forum VBScript
    Réponses: 13
    Dernier message: 15/04/2011, 10h31
  3. Formulaire d'insertion de fichiers sur serveur FTP
    Par CyrilD dans le forum Langage
    Réponses: 2
    Dernier message: 17/06/2010, 17h20
  4. + de 2000 fichiers sur serveur FTP
    Par _seb_ dans le forum WinDev
    Réponses: 4
    Dernier message: 17/09/2007, 10h59
  5. Erreur programme d'envoi fichier sur serveur ftp
    Par batssa dans le forum Langage
    Réponses: 3
    Dernier message: 17/08/2007, 14h30

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