Lire ou écrire un fichier sur disque dur, ftp ou http de maniere transparente

Soyez le premier à donner votre avis sur cette source.

Vue 18 245 fois - Téléchargée 1 662 fois

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 / Exemple :


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();

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BumpMANN
Messages postés
331
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
26 janvier 2009

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à...
BumpMANN
Messages postés
331
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
26 janvier 2009

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);
...
BumpMANN
Messages postés
331
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
26 janvier 2009

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
darkpoulpo
Messages postés
76
Date d'inscription
lundi 21 mars 2005
Statut
Membre
Dernière intervention
29 novembre 2009

tu as du te planter dans les arguments de fopen(), je me souviens que l'exemple marchait, et jusqu'a present ca marche
Mattpbem
Messages postés
46
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
31 juillet 2006

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"

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.