Oui t'as totalment raison, c'est bien de l'avoir vu, j'aurais dû même le préciser, la concaténation de chaines en vb est trés longue, et la gestion des buffers est mal faite. Pour être plus précis , pour concaténer deux chaines vb crée un buffer de la taille total dans lequel il y met les deux chaines, donc ça peut passer encore pour quelques centaines de Ko, mais dépassé le MO il est vraiment lent.
J'ai déjà eu ce probléme, alors l'astuce est simple, et pas trop compliquée à mettre en place :
On déclare le string qui va contenir tout le fichier :
Dim Buffer as string
On le dimensionne à la taille totale du fichier :
Buffer = space(Longeur de Fichier)
Puis on écrit dedans :
Mid(Buffer, Position d'écriture) = Texte à y inscrire ...
Pour ce genre de cas il faudrais avoir une variable de type Long pour savoir à quel emplacement du fichier on se trouve...
Bréf ce n'est que de la methodo, et en plus pour être minutieux il aurrais fallu être plus complet dans la requette Get, voir même donne que le répértoire et le nom de fichier, mais le code répond à un certain besoin donné, qui ne demande pas de gros fichiers, et dont le server accepte (j'espére) ce genre de requette "primitive" ...
Une alternative aurais été d'utiliser les api de windows, mais je ne suis pas sûr que ça passe dans les VBA (manque de practique), en tout cas, c'est une base pour débutter à télécharger des fichiers avec excel.
Par pur plaisir, et non par plagiat, voilà la fonction utilisée par API Guide pour télécharger un fichier :
Compatibilité : Requires Windows NT 4.0 or later; Requires Windows 95 or later
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Public Function DownloadFile(URL As String, LocalFilename As String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
If lngRetVal 0 Then DownloadFile True
End Function
Private Sub Form_Load()
'example by Matthew Gates (Puff0rz@hotmail.com)
DownloadFile "http://www.allapi.net", "c:allapi.htm"
End Sub
Bréf, walla si ça peut vous aider, j'en serais ravi, à +, et bonne prog, akh
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 18 nov. 2003 à 15:18
Ya un pb dans vb avec les tampons de type string dans winsock
lors de la reception de gros fichier a un debit important
le programme ralenti de maniere exponentiel due a
la concatenation des tampons. cela meme apres compilation
du projet.
Une solution consiste a utiliser un tableau de type byte
pre dimentionner selon le "Content-Length" et de copier
le tampon bout a bout
Bon je sait pas si je suis bien clair mais je voulais juste indiquer
ce probleme...
18 nov. 2003 à 16:59
J'ai déjà eu ce probléme, alors l'astuce est simple, et pas trop compliquée à mettre en place :
On déclare le string qui va contenir tout le fichier :
Dim Buffer as string
On le dimensionne à la taille totale du fichier :
Buffer = space(Longeur de Fichier)
Puis on écrit dedans :
Mid(Buffer, Position d'écriture) = Texte à y inscrire ...
Pour ce genre de cas il faudrais avoir une variable de type Long pour savoir à quel emplacement du fichier on se trouve...
Bréf ce n'est que de la methodo, et en plus pour être minutieux il aurrais fallu être plus complet dans la requette Get, voir même donne que le répértoire et le nom de fichier, mais le code répond à un certain besoin donné, qui ne demande pas de gros fichiers, et dont le server accepte (j'espére) ce genre de requette "primitive" ...
Une alternative aurais été d'utiliser les api de windows, mais je ne suis pas sûr que ça passe dans les VBA (manque de practique), en tout cas, c'est une base pour débutter à télécharger des fichiers avec excel.
Par pur plaisir, et non par plagiat, voilà la fonction utilisée par API Guide pour télécharger un fichier :
Compatibilité : Requires Windows NT 4.0 or later; Requires Windows 95 or later
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Public Function DownloadFile(URL As String, LocalFilename As String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
If lngRetVal 0 Then DownloadFile True
End Function
Private Sub Form_Load()
'example by Matthew Gates (Puff0rz@hotmail.com)
DownloadFile "http://www.allapi.net", "c:allapi.htm"
End Sub
Bréf, walla si ça peut vous aider, j'en serais ravi, à +, et bonne prog, akh
18 nov. 2003 à 15:18
lors de la reception de gros fichier a un debit important
le programme ralenti de maniere exponentiel due a
la concatenation des tampons. cela meme apres compilation
du projet.
Une solution consiste a utiliser un tableau de type byte
pre dimentionner selon le "Content-Length" et de copier
le tampon bout a bout
Bon je sait pas si je suis bien clair mais je voulais juste indiquer
ce probleme...
Peut importe
Bonne pr@g