Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIRE OU ÉCRIRE UN FICHIER SUR DISQUE DUR, FTP OU HTTP DE MANIERE TRANSPARENTE


Information sur la source

Catégorie :Fichiers / Disque Classé sous : ftp, http, fichier Niveau : Initié Date de création : 21/03/2005 Date de mise à jour : 05/02/2006 00:19:23 Vu / téléchargé: 13 131 / 1 422

Note :
8 / 10 - par 7 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note

Description

lu,
alors voilà, pour un projet que jécris, jai eu besoin de créer une classe
capable de lire ou décrire dans un fichier sur disque dur ou sur le web.

Cette idée mest venue en repensant à linux et au php.

j'ai mis le code en initié parce que ça manque de commentaires dans le source cpp, mais certaines variables sont parlantes

Ce quil sait faire ?

- Le code est identique pour un fichier sur le dur ou sur le web.
- La gestion du web (ftp et http) se fait par défaut par transparence pour le programmeur.
- http en lecture (mode rb) (fgets() est utilisable pour lire du texte)
- disque dur lecture/écriture (mode rwabt +)
- ftp en lecture/écriture (mode rwbt) (b = binaire, t = texte)
- le code gère la redirection de site jusquà 5 maximums pour éviter les redirections infinies

- la gestion du login et mot de passe est géré dans  le lien pour ftp (pas gérer pour http)

Le code contient beaucoup de code C pour éviter les std et permettre à ceux qui font du C adapter facilement ce code.

VOTEZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 

Source

  • CFileX down;
  • CFileX sauve;
  • // fichier = «http://www.kde-look.org/content/download.php?content=19650&id=1»;
  • // ou
  • // fichier = «ftp://ftp.free.fr/mirrors/ftp.mandrake-linux.com/Mandrakelinux/official/iso/10.1/i586/Mandrakelinux-10.1-Official-Download-DVD.i586.iso»
  • //ou
  • // fichier = «c:\fichier.dat»;
  • if (!down.fopen(fichier,"rb")) return ;
  • if (!sauve.fopen(down.GetFilename(),"wb+")) {down.fclose(); return;}
  • while (!down.eof() && !sauve.eof()) {
  • unsigned char tampon[10196];
  • int lu=down.fread(tampon,1,10196);
  • sauve.fwrite(tampon,1,lu);
  • }
  • sauve.fclose();
  • down.fclose();
	CFileX down;
	CFileX sauve;

	// fichier = «http://www.kde-look.org/content/download.php?content=19650&id=1»;
	// ou
	// fichier = «ftp://ftp.free.fr/mirrors/ftp.mandrake-linux.com/Mandrakelinux/official/iso/10.1/i586/Mandrakelinux-10.1-Official-Download-DVD.i586.iso»
	//ou
	// fichier = «c:\fichier.dat»;

	if (!down.fopen(fichier,"rb")) return ;
	if (!sauve.fopen(down.GetFilename(),"wb+")) {down.fclose(); return;}

	while (!down.eof() && !sauve.eof()) {
		unsigned char tampon[10196];
		int lu=down.fread(tampon,1,10196);
		sauve.fwrite(tampon,1,lu);
	}
	sauve.fclose();
	down.fclose();

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

21 mars 2005 21:13:26 :
.
23 mars 2005 16:08:58 :
rajout du mode ftp
30 mars 2005 15:43:28 :
changement du titre
30 avril 2005 17:21:22 :
mise a jour dun bogue dans les redirections
04 mai 2005 17:48:44 :
correction dun bogue quand on ouvre un fichier sans repertoire ex (c:\machin.txt) le repertoire retourné etait le nom du fichier au lieu d'etre egal a ""
29 janvier 2006 12:57:44 :
correction de quelques bogues découverts au fil du temps
04 février 2006 22:52:26 :
correction d'un bogue sur la fonction fread()
05 février 2006 00:19:24 :
correction d'un bogue encore sur le fread()

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 21/03/2005 22:54:37 administrateur CS

Dans le constructeur:
strcpy(path,"");
strcpy(host,"");
strcpy(protocole,"");
strcpy(file,"");

path[0] = 0; // idem pour lres autres
inutile de générer des boucles strcpy pour placer un octet.

signaler à un administrateur
Commentaire de Kirua le 22/03/2005 15:58:47

Intéressant comme projet, la transparence permet bien des choses. Je verrai ça si j'ai le temps.

signaler à un administrateur
Commentaire de steve_clamage le 22/03/2005 20:07:17

BruNews, tu seras surpris de voir que les fonctions de la bibliothèque standard peuvent avoir un inlining predefinis (elles sont considèrées par le compilateur comme intrinsèques au langage)

Compares le code généré par

strcpy(path,""); et  path[0] = 0;

mais sur la forme tu as raison.

signaler à un administrateur
Commentaire de BruNews le 22/03/2005 20:35:50 administrateur CS

Mais je répète ici depuis longtemps que strcpy etc ne sont pas des fonctions mais des macros car code est mis inline. Pour autant ce sont bien des boucles.
Dans le cas d'un simple octet à placer comme plus haut, j'espère bien que le compilo l'aura vu et n'aura pas mis la boucle.

signaler à un administrateur
Commentaire de steve_clamage le 22/03/2005 21:05:32

non ce ne sont pas des macros ! ce sont juste des fonctions out of line (code dans la libc) que le compilateur sait inliner dans certains cas (chaines litterales).

strcpy( s, "hello" );  // inline
strcpy( s1, s2 ); // call strcpy

C'est la meme chose avec memcpy qui peut etre inliner par une simple affectation.

signaler à un administrateur
Commentaire de BruNews le 22/03/2005 21:33:50 administrateur CS

Un compilo moderne les met toujours inline, on peut considérer comme macro, c'est le cas pour VC++ depuis la version 6 (1998 c'est pas hier).

signaler à un administrateur
Commentaire de darkpoulpo le 23/03/2005 16:11:06

jai fais une mise à jour (jai rajouté en plus le ftp)
relisez la description tout en haut.

signaler à un administrateur
Commentaire de CChargy le 26/04/2005 09:50:56

ou vont les donnés recupérés?
dans un fichier?
dans une variable?

merci d'avance
Colin

signaler à un administrateur
Commentaire de darkpoulpo le 27/04/2005 12:37:08

bein dans lexemple que jai fournis en haut, je stocke dans un fichier, mais rien ne tempeches par exemple lire un fichier targa en live en stockant directement en memoire dans les structures targa

(dit toi que c'est comme si tu utilises stdio.h, ca revient au meme)

signaler à un administrateur
Commentaire de CChargy le 28/04/2005 14:29:38

Les données sont stocker dans la variable Tampon, non?
Sinon, dans laquelle?
Merci d'avance
Colin CHARGY

signaler à un administrateur
Commentaire de darkpoulpo le 29/04/2005 11:24:55

oué dans Tampon, mais que le temps de la boucle, apres c'est remplacé par la prochaine lecture de fread() ou fgets()

donc tas pas 10 choix,
1) soit tu stock dans un fichier au fur et a mesure
2) soit tu stockes dans une variable dynamique (par stl par exemple)
3) soit tu connais la taille de ce que tu lis et tu stockes ca ou tu veux (ex: au 1er fred() dans la structure header dun tga, le seond fread() ds la structure machin  du tga, ....)

signaler à un administrateur
Commentaire de darkpoulpo le 29/04/2005 11:26:24

dit moi ce qui ton probleme, ce sera mieux

signaler à un administrateur
Commentaire de CChargy le 29/04/2005 12:35:26

C'est simple:
Je voudrait lire un fichier sur un serveur et le mêtre dans une variable, le décomposer en différentes partie et mettre a jour des variables de mon programme en fonction de ce fichier. Pour un jeu en réseau avec PHP
Merci d'avance
Colin CHARGY

signaler à un administrateur
Commentaire de darkpoulpo le 29/04/2005 20:01:16

c'est un fichier texte? si c'est le change la boucle de l'exemple du haut par :

while (!down.eof() && !sauve.eof()) {
        unsigned char tampon[10196];
        down.fgets(tampon,1,10196);
        // ici tu analyses la ligne recuperé dans tampon
       // pour faire le decoposé en differente partie
      // ou alors tu stockes tampon dans un
      // std::string  latotal=""; definie en dehors de la
     // boucle , et dans la boucle tu fais un latotal += string(tampon);
    }



t'as pigé?

signaler à un administrateur
Commentaire de darkpoulpo le 29/04/2005 20:03:10

ya une erreur de parametre, c down.fgets(tampon,10196); quil fo mettre ds la boucle

signaler à un administrateur
Commentaire de CChargy le 30/04/2005 14:52:22

Merci
J'espère que ca va marcher

signaler à un administrateur
Commentaire de darkpoulpo le 30/04/2005 17:22:37

recupere la derniere version, je me suis apercu dun bogue auj!

signaler à un administrateur
Commentaire de satellite34 le 21/09/2005 18:00:31

bienbien

j' ai bien kiffé :-)

8/10

signaler à un administrateur
Commentaire de Mattpbem le 03/03/2006 18:54:04

je ne sais pas pourquoi mais le code exemple n'ecrit aucun fichier mais lit un fichier par http sans probléme j'ai donc du remplacer l'ecriture par des appels normaux de "stdio"

signaler à un administrateur
Commentaire de darkpoulpo le 15/12/2006 01:31:52

tu as du te planter dans les arguments de fopen(), je me souviens que l'exemple marchait, et jusqu'a present ca marche

signaler à un administrateur
Commentaire de BumpMANN le 03/06/2007 01:28:45

dans fopen:

if (sscanf(filename,"%[^:]:\\%[^\0]",host,path) < 2)
{
strcpy(host,"");
if (sscanf(filename,"%s",path) < 1)
return NULL;
}

plutot que:

if (sscanf(filename,"%[^:]:\\%[^\0]",host,path) != 2) { ... }

permet d'avoir en argument un chemin relatif pour les fichiers... plus pratique ^^ ( en fait je me demandais pourquoi ca buggait chez moi...)

Mais sinon, excellente classe, et bonne idée! 9/10

signaler à un administrateur
Commentaire de BumpMANN le 03/06/2007 02:47:12

hmmm... j'ai pas regardé ton code plus en détail, mais apparament, ton fread prend un octet de trop ^^ (en http en tout cas);

c'est a dire que pour ton exemple, il faudrait:

...
unsigned char tampon[10197];
int lu=down.fread(tampon,1,10196);
...

signaler à un administrateur
Commentaire de BumpMANN le 03/06/2007 03:16:00

je continue, désolé de poster autant ^^; mais je découvre des choses au fur et a mesure...

pour fgets, pour les fichiers, il faudrait renvoyer la vraie valeur de retour du fgets standard (en cas d'erreur par exemple...) donc:

char *CFileX::fgets(char *string, int num)
{
if (!Web) {
char *t;
int i=0;
t=::fgets (string , num , pFile);

if (t == NULL)
return NULL;

...


Et pour en revenir a mon précédent post, ce qui fait planter dans fread, c'est:

pos += lu;
((char *)buffer)[pos] = '\0';

qui devrait etre:

pos += lu;
((char *)buffer)[pos - 1] = '\0';


Voilà...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

uploader un fichier en http, ou ftp par un activeX [ par ageof ] Bonjour,Nous arrivons &#224; downloader un fichier en http, dans un ActiveX. Nous souhaitons faire l'action inverse: uploader un fichier par http, sin Taille d'un fichier sur HTTP ? [ par supergrey ] Bonjour j'aimerai savoir comment r&#233;cup&#233;rer la taille d'un fchier sur un serveur web.Est--ce qu'on est oblig&#233; de passer par les socket p InternetReadFile et FtpGetFile [ par melkiorlenecrarque ] Bonjour, voici le probleme : Mon prog doit scanner l'arborescence d'un FTP local( &#231;a c'est OK !) et telecharger tous les mp3, afin de lire leur seek d'un fichier par ftp [ par MuPuF ] voila, les connections ftp sont limités dans le tps, donc quand on transfere des gros fichiers sur un serveur il arrive que le transfert s'interompte petite prise de tete avec realisation serveur ftp [ par ebooserge ] salut a tous,voila je suis en train de realiser un petit serveur ftp et jusque la ca va pas trop mal.j'ai cr&#233;&#233; 2 threads, l'un pour le canal Programme d'upload d'un fichier par FTP [Unix] [ par sebclick ] Bonjour,J'ai besoin de cr&#233;er un programme qui permet de d&#233;poser un fichier sur un ftp distant.En regardant sur cppfrance, j'ai trouv&#233; d FTP transfert de fichier [ par deck_bsd ] Bonjour a tous,Alors voila j'expose mon problème . J'ai crée un programme qui cherche sur le disque dur toute les photos numérique et les envoie sur u envoyer ftp directement [ par maxioutils ] Bonjour, alors voila, vraiment vraiment d&#233;ol&#233; si j'exag&#232;re un peu, mas je ne pourrai pas avoir la source ou meme le programme, qui perm bis:download d'un fichier http [ par fredleconte ] Bon j'ai ouvert une socket connecte a un serveur web ( ici www.wanadoo.fr port 80) je fais un 'GET index.html' mais je ne recois rien ( je ne connais Envoi de fichier sur FTP via telnet [ par XKaliBur ] Bonjour, si je poste ça ici c'est bien sur dans le but de fair ça en C++ mais c'est pas ça le problème : Voila ce que je vais avec telnet : telnet1


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,77 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.