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 564 fois - Téléchargée 1 689 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 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
3 juin 2007 à 03:16
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 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
3 juin 2007 à 02:47
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 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
3 juin 2007 à 01:28
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
15 déc. 2006 à 01:31
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
3 mars 2006 à 18:54
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"
Afficher les 23 commentaires

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.