FtpFindFirstFile et AS 400

Résolu
papacib Messages postés 3 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 5 février 2007 - 3 févr. 2007 à 10:10
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 11 févr. 2007 à 20:48
Bonjour,

Veuillez m'excuser si j'utilise des termes inapropriés car je ne suis pas de formation informatique.
Jusqu'à maintenant j'ai toujours su me débrouiller en faisant des recherches sur les forums mais là
j'ai passé pas mal d'heures sur tous les forums sans trouver  de réponse.

Pour mon travail j'ai une base access dans laquelle j'utilise les fonctions FTP de Wininet

Cela fonctionne sauf que je doit maintenant me connecter à un AS 400 et je n'arrive plus à lister correctement les fichiers du serveur avec FtpFindFirstFile et InternetFindNextFile

Votre aide serait la bien venue,

Voici la fonction que j'utilise (je passe sur les déclarations des fonctions et des constantes de wininet)

Function ListeFtpFile(stServ As String, stLogin As String, stPass As String, _
                            stRepFtp As String, Optional stFiltre As String) As Boolean
' Cette fonction liste les fichiers sur un serveur FTP.
' stServ contient le nom ou l'adresse IP du serveur FTP
' stLogin est le login à utiliser
' stPass est le mot de passe associé au login
' stRepFtp est le répertoire FTP ou s'effectuera la recherche
' stFiltre est le nom du fichier qui sera effacé du serveur
' La fonction retourne Vrai si le listage à réussi, sinon Faux.


'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Dim HwndConnect As Long
Dim HwndOpen As Long
Dim inRes As Integer
Dim strFile As String
Dim zErreur
'""""""""
Dim strTmp As String
    pData.cFileName = String(MAX_PATH, 0)
'""""""""""""""""""""""
On Error GoTo GestErreur


    If stFiltre "" Then stFiltre "*.*"
   
       'Ouvre internet
HwndOpen = InternetOpen("ListeFtpFile", 1, vbNullString, vbNullString, 0)
If HwndOpen Then
AjoutMess ("Connection ... ")
    'Connection au site ftp
    HwndConnect = InternetConnect(HwndOpen, stServ, 21, stLogin, _
                                              stPass, 1, 0, 0)
    If HwndConnect Then
    AjoutMess ("Connecté au serveur: " & stServ)
        If stRepFtp = "/" Then GoTo Racine
     
        'Changer le repertoire ftp
        If FtpSetCurrentDirectory(HwndConnect, stRepFtp) Then
        AjoutMess ("Répertoire courant : " & stRepFtp)
Racine:
        'Liste les fichiers présents sur le site
        AjoutMess ("Recherche des fichiers: ")
'""" VERSION 1""""""""""""""""""
'            hFind = FtpFindFirstFile(HwndConnect, stFiltre, pData, 0, 0)
'                If hFind = 0 Then GoTo zerofichier
'
'            strTmp = Left(pData.cFileName, InStr(1, pData.cFileName, _
'                    String(1, 0), vbBinaryCompare) - 1)
'            AjoutMess (strTmp)
'            ListeFtpFile = True
'            Do
'                pData.cFileName = String(MAX_PATH, 0)
'                lRet = InternetFindNextFile(hFind, pData)
'            If lRet = 0 Then: Exit Do
'                strTmp = Left(pData.cFileName, InStr(1, pData.cFileName, _
'                    String(1, 0), vbBinaryCompare) - 1)
'            AjoutMess (strTmp)
'            Loop
'""" VERSION 2""""""""""""""""""
        hFind = FtpFindFirstFile(HwndConnect, stFiltre, pData, INTERNET_FLAG_RELOAD, 0)
            If hFind = 0 Then GoTo zerofichier
            If hFind Then
               If hFind > 0 And CBool(pData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = False Then
                        strTmp = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
                        AjoutMess (strTmp)
                        ListeFtpFile = True
                End If
               Do
                   lRet = InternetFindNextFile(hFind, pData)
                    If lRet = 0 Then: Exit Do
                    If lRet > 0 And CBool(pData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = False Then
                       strTmp = Left(pData.cFileName, InStr(1, pData.cFileName, _
                       String(1, 0), vbBinaryCompare) - 1)
                       AjoutMess (strTmp)
                       ListeFtpFile = True
                    End If
               Loop
            End If
'"""""""""""""""""""""""""""""""""
        Else
            AjoutMess ("Impossible de se positionner sur le répertoire " & stRepFtp)
            GoTo GestErreur
        End If
    Else
        AjoutMess ("Impossible d'établir la connexion avec le SERVEUR")
        GoTo GestErreur
    End If
Else
    AjoutMess ("Impossible d'ouvrir la connexion INTERNET")
    GoTo GestErreur
End If
GoTo FinNormale
zerofichier:
        'Pas de fichier
        If Err.Number = 92 Then
            AjoutMess (" Erreur : PAS DE FICHIER SUR LE SITE FTP ")
        End If
GestErreur:
            zErreur = ShowError
            AjoutMess ("Impossible de générer la liste :" & zErreur)
            ListeFtpFile = False


FinNormale:
AjoutMess ("Déconnection...")
    ' Libération du pointeur
    inRes = InternetCloseHandle(HwndConnect)
InternetCloseHandle HwndOpen 'Ferme internet


End Function

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 févr. 2007 à 20:48
Re
En effet, il arrive que certains serveurs ne répondent pas avec le même format.
Personnellement, en questionnant un Vax, j'ai un autre format.
Il va falloir que tu dépouilles les chaines reçues pour retrouver tes petits.

Sur un Vax, il me retourne la taille du fichier "blocks" (1 block = 512 octets)
Peut-être que les AS/400 ont des unités aussi différentes ... cherche à trouver un multiple.

En ce qui concerne le cash :
Quand tu fais une requète FTP (ou même HTTP), l'interface mémorise le résultat.
Si tu reposes la même question, il ne pose pas la question à l'hôte, mais ressort les données en cash.
Cela peut poser des problèmes. J'ai personnellement choisi de ne pas mettre en cash les résultats.
Ceci est une option des commandes avec les APIs.
Pour plus d'infos sur le paramétrage correct et détailler -->  'api-guide' et 'apiviewer' dispos gratuits sur http://www.allapi.net

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 févr. 2007 à 18:09
Salut
"je n'arrive plus à lister correctement les fichiers du serveur" : Et ?
Il faudrait nous en dire plus ce que tu obtiens comme résultat.
As-tu une erreur ? laquelle
La liste est incomplète ?
Le nom des fichiers reccueillie a t-elle une structure différente de ce que tu cherches ?
Est-ce que ça marche à la première recherche mais plus les fois suivantes ? (c'est la boule de cristal qui m'a suggérée cette question)
Je te suggère d'utiliser des constantes dans l'utilisation des APIs car elle peuvent changer la manière de se comporter, notamment sur la gestion du cash qui est souvent un problème.
Comme par exemple (lignes extraites de cette source : clique ici) :
    hOpen = InternetOpen("My FTP Transfer", _
                                         INTERNET_OPEN_TYPE_DIRECT, _
                                         vbNullString, _
                                         vbNullString, _
                                         INTERNET_FLAG_NO_CACHE_WRITE)

    iConnHandle = InternetConnect(hOpen, _
                                                     sServerName, _
                                                     INTERNET_INVALID_PORT_NUMBER, _
                                                     sUserName, _
                                                     sPassWord, _
                                                     INTERNET_SERVICE_FTP, _
                                                     INTERNET_FLAG_EXISTING_CONNECT Or INTERNET_FLAG_PASSIVE, &H0)

Les valeurs a utilisées sont détaillées dans les utilitaires qui décrivent l'utilisation des APIs comme 'api-guide' ou 'ApiViewer' disponibles sur www.allapi.net

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005, en lice pour 2006, délibérations en cours
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
papacib Messages postés 3 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 5 février 2007
4 févr. 2007 à 10:05
Bonjour jack

Je n'ai pas d'erreur, et cela fonctionne parfaitement sur les autres serveurs.

La liste est complète mais elle à une structure partichière

Exemple de résultat obtennu au lieu de BL01070129 qui est un fichier ascii :
CGCFTP 167936 29/01/07 09:53:26*FILE BL01070129
CGCFTP *MEM BL01070129.BL010701129

Par contre je vais suivre tes conseils pour InternetOpen et InternetConnect et faire un test lundi matin car il y a un contrôle d'adresse IP à la connexion qui m'interdit les tests depuis mon domicile.

Pourrai tu m'exoliquer ce que tu entends par "Gestion du cash"

Merci pour ton aide!
0
papacib Messages postés 3 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 5 février 2007
5 févr. 2007 à 09:02
Voici les tests que j'ai fait ce matin

J'ai utilisé WS_FTP pour connaitre les différents trois serveurs auquels je me connecte quotidiennement
Ensuite j'ai mis le même fichier sur les serveurs et j'ai les résultats suivants:

Serveur1 (WS_FTP)
220 Serv-U FTP Server v6.0 for WinSock ready...
Host type (1): Serv-U
Liste des fichiers obtenue par WS_FTP:
Name Date Size
test1 20070205 08:22 1580
Liste des fichiers obtenue par ma fonction:
test1

Serveur2 (WS_FTP)
UNIX Type: L8 Server: "WarFTPd 1.82.00-RC2" OS: "WIN32 (Windows 2000 5.0 2195 Pentium II 2-CPU)"
Host type (S): UNIX (standard)
Liste des fichiers obtenue par WS_FTP:
Name Date Size
test1 20070205 08:29 1580
Liste des fichiers obtenue par ma fonction:
test1

Serveur3 (WS_FTP)
257 "CGC" is current library.
Host type (I): IBM AS/400
Liste des fichiers obtenue par WS_FTP:
Name Date Size
TEST1 20050207 08:34 36864
TEST1.TEST1 20050207 08:34 36864
Liste des fichiers obtenue par ma fonction:
CGCFTP 36864 05/02/07 08:34:18 *FILE TEST1
CGCFTP *MEM TEST1.TEST1

Ce résultat confirme que ma fonction est correcte mais que j'ai un problème avec l'as400

Avez vous une idée pour résoudre ce problème?
0
Rejoignez-nous