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

Contribuez Discussion :

Probleme avec FtpGetFileSize en VBA [Sources]


Sujet :

Contribuez

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 368
    Points : 23 840
    Points
    23 840
    Par défaut Probleme avec FtpGetFileSize en VBA
    Bonjour à tous et merci de votre temps.

    J'essaye de récupérer la taille d'un fichier ftp avec la fonction ftpGetFileSize mais je n'obtient que -1.

    La taille (32Mo) est bien envoyee par le serveur FTP mais je ne parvient pas à l'obtenir dans les variables de mon prog.

    La signature actuelle de ftpGetFileSize est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private Declare Function FtpGetFileSize Lib "wininet.dll" (ByRef hFile As Long, ByRef lpdwFileSizeHigh As Long) As Long
    et voici le code que j'utilise.

    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
     
        If Not aErreur Then
            'Lit la taille du fichier
            Dim fichier As Long
            Dim octetHautTailleFichier As Long
            Dim octetBasTailleFichier As Long
            Dim tailleFichier
            Dim nomFichier As String: nomFichier = "TEST.MDB"
     
            fichier = FtpOpenFile(connexion, nomFichier, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY + INTERNET_FLAG_RELOAD, contexte)
            If fichier <> 0 Then
                    Debug.Print "Ouverture du fichier " & nomFichier & " faite"
                Else
                    aErreur = True
            End If
     
            If Not aErreur Then
     
               '#######################################
               '#######################################
     
                octetBasTailleFichier = FtpGetFileSize(fichier, octetHautTailleFichier)
     
               'Normalement ici octetBasTailleFichier et octetHautTailleFichier devraient avoir une valeur 
               'mais pourtant octetBasTailleFichier=-1 et octetHautTailleFichier=0
     
               '#######################################
               '#######################################
     
                If octetBasTailleFichier = INVALID_FILE_SIZE Then
                        aErreur = True
                        Call ShowError
                    Else
                        If octetHautTailleFichier = 0 Then
                                tailleFichier = octetBasTailleFichier
                            Else
                                'Pour le moment la ligne qui suit est fausse
                                tailleFichier = octetHautTailleFichier
                        End If
     
                        Debug.Print "Taille du fichier " & nomFichier & " : " & result
                End If        
            End If
     
            result = InternetCloseHandle(fichier)
            aErreur = (result = ECHEC)
            If Not aErreur Then
                    Debug.Print "Deconnexion fichier " & nomFichier
                Else
                    Call ShowError
            End If
        End If
    A+

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Oui en effet

    Une autre approche consiste à utiliser la fonction ftpfindfirstfile et la structure WIN32_FIND_DATA

    Mais malheureusement le résultat semble le même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim hconnection As Long, hopen As Long, dwseman As Long
    Dim hFile As Long, result As WIN32_FIND_DATA
    'Ouvre la connexion internet
    hopen = InternetOpen("My VB Test", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
    'Ouvre une connexion au serveur FTP
    hconnection = InternetConnect(hopen, ftpserver, INTERNET_INVALID_PORT_NUMBER, _
        "toto", "psstoto", INTERNET_SERVICE_FTP, 0, 0)
    'Ouvre le fichier
    FtpFindFirstFile hconnection, "index.php", result, 0, 0
    MsgBox result.cFileName
    MsgBox result.nFileSizeHigh
    End Sub
    Si le premier msgbox renvoie bien le nom de fichier, le second affiche 0

    La déclarationde l'api étant


    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
    Option Compare Database
    Option Explicit
    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 Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _
    (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _
          lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long
     
    Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
    Public Const INTERNET_INVALID_PORT_NUMBER = 0
    Public Const INTERNET_SERVICE_FTP = 1
     
    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 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

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 368
    Points : 23 840
    Points
    23 840
    Par défaut
    Merci de ton aide.

    En fouillant sur Internet (vive Google !) j'ai finalement découvert une fonction SIZE. Voilà comment je contourne le problème en passant directement une commande FTP à mon serveur.

    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
     
        Private Const API_TRUE As Long = 1
        Private Const API_FALSE As Long = 0
     
        Const SUCCES As Long = 1
        Const ECHEC As Long = 0
        .
        .
        If Not aErreur Then
            result = FtpCommand(connexion, API_FALSE, FTP_TRANSFER_TYPE_ASCII, "SIZE " & nomFichier, 0, 0)
            aErreur = (result = ECHEC)
            If Not aErreur Then
                'get the required buffer size
                InternetGetLastResponseInfo lErr, reponseServeur, longueurReponseServeur
                'create a buffer
                reponseServeur = String(longueurReponseServeur, 0)
                'retrieve the last respons info
                InternetGetLastResponseInfo lErr, reponseServeur, longueurReponseServeur
                morceauReponse = Split(reponseServeur)
                tailleFichier = Val(morceauReponse(1))
                Debug.Print "taille du fichier " & nomFichier & " : " & tailleFichier
            End If
        End If

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

Discussions similaires

  1. Problemes avec ADO dans VBA
    Par MuadDib_II dans le forum VBA Access
    Réponses: 9
    Dernier message: 26/06/2008, 17h33
  2. Probleme avec un module VBA
    Par shuin dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/05/2007, 01h54
  3. [VBA-E] probleme avec la fonction countif
    Par adamm dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/02/2006, 10h23
  4. [VBA WORD] Probleme avec un .dot
    Par jagdjg dans le forum VBA Word
    Réponses: 6
    Dernier message: 18/01/2006, 12h07
  5. [VBA-E] problème avec le sendkeys
    Par darkpocket dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/02/2005, 15h25

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