Transfert ASCII impossible avec InternetReadFile

cs_onsenfou Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 30 mars 2004 - 30 mars 2004 à 16:53
cs_onsenfou Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 30 mars 2004 - 30 mars 2004 à 20:14
Salut à tous,

Voilà, j'ai un ptit problème de vb... j'ai développé pour mon taff(!) une applie qui utilise le téléchargmement à partir d'une applie vb de fichiers textes (.csv) situés sur un serveur FTP Unix...
Le problème, c'est que lorsque je rappatrie ces fichier, je le fais par défaut en binaire, ce qui fait qu'en passant de UNIX à Windows, j'ai des problèmes sur les retours chariots... je veux donc effectuer le transfert en acsii...

je n'utilise pas les contrôle inet, mais les fonctions suivantes:

-> InternetOpen pour configurer la connexion au serveur
-> InternetConnect pour faire la connexion FTP
-> InternetOpenUrl pour ouvrir le fichier

Cette dernière méthode est écrite comme suit:

hConnection = InternetOpenUrl(hOpen, filepath & "/" & LST_FILE(i).fname, vbNullString, 0, INTERNET_FLAG_PASSIVE, 0)

Une fois cette méthode exécutée, je fais une boucle (je simplifie bcp le code pour que ce soit clair) pour gérer un progressbar et calculer donc les octets envoyés / restants à recevoir...

Do
...
...
lresult = InternetReadFile(hConnection, Buffer, BUFFSIZE, BufferReturned)
...
...
Loop until BufferReturned = 0

Or tout marche nikel, je télécharge des fichier de + de 600Mo sans soucis, mais cette méthode internetReadFile me pose des soucis, parce que je n'arrive pas à forcer avec elle la lecture en ASCII... C'est systématiquement en binaire, et ça me fout en l'air mon fichier.

Voilà, si quelqu'un pouvait m'aider, ça serait super sympa, j'aimerai bien pouvoir achever ce problème !

Un grand merci d'avance pour vos idées et vos coup de main

4 réponses

thierrydelepine Messages postés 521 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 11 septembre 2008 6
30 mars 2004 à 17:23
J'utilise ce code ci dessous que je place dans un module pour faire des transferts de ficheirs entre UNIX et WINDOWS, cela marche parfaitement.

fait un copier coler dans un module, au debut de la function, j'ai mis en commentaire comment l'utiliser.

lol, bonne prog.

Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'declaration pour la fonction GetFTP

Private 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
Private 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
Private 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
Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

Const FTP_TRANSFER_TYPE_UNKNOWN = &H0
Const FTP_TRANSFER_TYPE_ASCII = &H1
Const FTP_TRANSFER_TYPE_BINARY = &H2

'Create a new project and add this code to Form1
Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Const LANG_NEUTRAL = &H0
Const SUBLANG_DEFAULT = &H1
Const ERROR_BAD_USERNAME = 2202&
Private Declare Sub SetLastError Lib "kernel32" (ByVal dwErrCode As Long)

Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
Private Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, ByVal lpszBuffer As String, lpdwBufferLength As Long) As Boolean

Public Function GetFTP(Host As String, User As String, Password As String, CheminForGetFTP As String, SourceFile As String, DestinationFile As String) As String

'exemple d'utilisation

'MyResult = GetFTP("NomDNSmachine","user","MyPassword","ficheirArecuperer","CheminCompletEtNomDuFichierAecrire")
'if MyResult <> "OK" then
' MsgBox MyResult, vbOKOnly + vbCritical
' end
'endif

Dim MyResult As Boolean
Dim hConnection As Long, hOpen As Long, sOrgPath As String

'ouvre une connection internet
hOpen = InternetOpen("API-Guide sample program", 0, vbNullString, vbNullString, 0)
'connexion au serveur FTP
hConnection = InternetConnect(hOpen, Host, 21, User, Password, 1, IIf(0, &H8000000, 0), 0)
If hConnection <> 0 Then

'change le repertoire du serveur FTP
MyResult = FtpSetCurrentDirectory(hConnection, "/" & Host & "/" & CheminForGetFTP)
If MyResult = False Then
GetFTP = "Impossible de se positionner dans le répertoire : /" & Host & "/" & CheminForGetFTP
'ferme la connexion FTP
InternetCloseHandle hConnection
'ferme la connexion internet
InternetCloseHandle hOpen
Exit Function
End If
End If
MyResult = False

'recupere le fichier demandé du serveur FTP
MyResult = FtpGetFile(hConnection, SourceFile, DestinationFile, False, 0, FTP_TRANSFER_TYPE_ASCII, 0)
If MyResult Then
GetFTP = "OK"
'ferme la connexion FTP
InternetCloseHandle hConnection
'ferme la connexion internet
InternetCloseHandle hOpen
Exit Function
Else
Dim lErr As Long, sErr As String, lenBuf As Long
'recupere la longueur du message pour creer un buffer
InternetGetLastResponseInfo lErr, sErr, lenBuf
'creer un buffer
sErr = String(lenBuf, 0)
'recupere l'information ou le message d'erreur
InternetGetLastResponseInfo lErr, sErr, lenBuf
'show the last response info
GetFTP = "Error " + CStr(lErr) + ": " + sErr
End If

'ferme la connexion FTP
InternetCloseHandle hConnection
'ferme la connexion internet
InternetCloseHandle hOpen

End Function
0
cs_onsenfou Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 30 mars 2004
30 mars 2004 à 17:37
Merci bcp pour ta réponse et pour ton code !

Seulement, le ptit problème, c'est que j'ai déjà essayé ta solution avant, mais que ça ne me permet pas de gérer un progressbar, car on ne peut pas suivre l'état d'avancement du téléchargement...

C'est en ça que je suis bloqué, je veux utiliser internetReadFile en ASCII... ou FTPGetFile, mais dans ce cas avec un contrôle sur l'état du transfert...

MERCI d'avance
0
thierrydelepine Messages postés 521 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 11 septembre 2008 6
30 mars 2004 à 17:42
j'avais reflechis a la question et a priori tu ne fera pas de transfert ascii avec InternetOpenUrl.

pour moi c'est le seul code apres mainte recherche que j'ai trouvé qui permet de sélectionner ascii ou binaire.

si tu a besoin d'avoir une progressbar pour suivre le telechargement simple:
tu regarde la taille du fichier avant transfert, tu regarde la taille du fichier deja recu lorsque tu le telecharge a interval regulier (genre toutes les 200 ms) sur le windows, tu fais le prorata de ce que tu recois en 1 seconde et en prime tu pourra afficher le taux de transfert.
voial la theorie maintenant il ne te reste plus qu'a faire des recherches, je n'ai pas de code sous la main pour ça.

bye
0
cs_onsenfou Messages postés 3 Date d'inscription lundi 22 mars 2004 Statut Membre Dernière intervention 30 mars 2004
30 mars 2004 à 20:14
Arf je suis au regret de voir que ce que je craignais s'avère exact à savoir que je ne pourrai pas faire un transfert en ascii comme ça....

Merci bcp en tout cas pour ta spontanéité et ton aide précieuse !
0
Rejoignez-nous