Copier un fichier d'internet sur le disque dur en C
cs_Diabolus
Messages postés61Date d'inscriptionsamedi 20 décembre 2003StatutMembreDernière intervention28 septembre 2007
-
18 janv. 2004 à 00:14
cs_Diabolus
Messages postés61Date d'inscriptionsamedi 20 décembre 2003StatutMembreDernière intervention28 septembre 2007
-
18 janv. 2004 à 18:13
Salut à tous,
Je cherche à faire une fonction qui me permettrait de copier un fichier se trouvant sur internet pour le copier sur le disque dur en local.
Est ce qu'il y a une primitive C qui permet de copier des fichiers (comme unlink pour les supprimer)
et comme accéder à internet (un fopen("http://www.....","r");
ne marche pas.
Merci
A voir également:
Copier un fichier d'internet sur le disque dur en C
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 janv. 2004 à 12:01
Salut,
Tu peux utiliser les sockets, pour etablir la connexion au serveur http, envoyer une requete et recuperer le fichier.
Idem avec le protocol ftp.
Il y a aussi les fonctions wininet, InternetOpen(...), InternetOpenUrl(...) et compagnie.
J'ai deja posté un exemple de telechargement de fichier avec cette technique:
http://www.cppfrance.com/forum.v2.aspx?ID=165981
Anacr0x
Messages postés515Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention27 avril 20062 18 janv. 2004 à 12:18
en utilisant les sockets, ca me parait relativement compliquer...
avec la commande GET, on récupère également l'entete qu'il faut évidement virer avant d'inscrire le fichier (ca, ca doit pas etre trop dur)
mais comment connaitre la taille du fichier ? c plutot embétant lorsqu'on récupère la fichier avec un while()
On pourrait dire que si l'on recoit plus de donné, c fini mais bon, j'aime pas trop cette solution...
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 janv. 2004 à 12:32
Salut,
Tu as une connexion a établir, un requete a envoyer, et c'est tout.
Comment connaitre la taille, le type et le nom du fichier ? Facile, en regardant dans l'entete de réponse du serveur.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 janv. 2004 à 12:44
Salut,
Exemple de reponse du serveur:
HTTP/1.1 200 OK
Date: Fri, 26 Dec 2003 18:02:37 GMT
Server: Apache/1.3.27 (Unix) Debian GNU/Linux
Last-Modified: Sat, 20 Dec 2003 12:25:18 GMT
ETag: "124ee55-6f5-3fe43fae"
Accept-Ranges: bytes
Content-Length: 1781
Connection: close
Content-Type: application/zip
Cette entete est suivie d'une ligne vide (\\r\\n\\r\\n) qui elle meme est suivie du fichier.
On y apprend que c'est un fichier zip de 1781 octets, et que la connexion sera fermée par le serveur une fois le fichier transferé.
cs_Diabolus
Messages postés61Date d'inscriptionsamedi 20 décembre 2003StatutMembreDernière intervention28 septembre 20071 18 janv. 2004 à 14:30
Salut,
Le code que tu m'as donné (avec le lien) marche nickel, mais si je veux simplement copier le fichier, est ce qu'il y a une primitive semblable à celles qui sont dans ton code pour copier (au lieu de lire par exemple)?
Ou est ce que je dois obligatoirement lire le fichier et copier chaque caractère un par un dans un autre fichier ?
(Est ce que cette dernière technique marche avec une photo ou un exe ??)
Merci beaucoup déjà pour cette première approche !
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 janv. 2004 à 14:38
Salut,
Le fichier téléchargé se trouve dans le buffer pFile.
La taille du buffer est stockée dans dwFileSize.
Libre a toi de l'afficher ou de le copier dans un fichier.
Evidement que ca marche avec exe, bmp jpeg wav et autres, dans tout les cas ce ne sont que des suites d'octets.
cs_Diabolus
Messages postés61Date d'inscriptionsamedi 20 décembre 2003StatutMembreDernière intervention28 septembre 20071 18 janv. 2004 à 16:34
Il me reste un problème pour copier la suite d'octets :
En laissant pFile de type chaine de caractères, j'essaie de copier le fichier en faisant :
.........
i=0;
while(i<dwFileSize){
fputc(pFile[i] , fichier);
i++;
}
.....
Et ça me recopie pas exactement le fichier. Ca me rajoute quelques caractères.
(ex une photo de 59ko fait après 59,2ko. La différence apparait assez tôt dans le fichier)
Est que ça peut marcher en conservant cette technique (donc où est mon erreur), ou est ce que l'on peut manipuler un tableau de bits ou octets et pouvoir copier dans le fichier octet par octet (au lieu de passer par des caractères qui font 4 octets chacun) (si l'erreur vient de ça)?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 janv. 2004 à 16:43
Salut,
pFile n'est pas une chaine de caractere ! c'est un buffer de dwFileSize octets. Ton fichier se trouve entre l'adresse pFile et l'adresse pFile+dwFileSize.
Je te conseille plutot fwrite qui ecrira tout le buffer dans ton fichier d'un coup.
fwrite(pFile, dwFileSize, 1, fichier);