begin process at 2012 05 27 20:25:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :16 593 / 1 576

Auteur : darkpoulpo

Ecrire un message privé
Site perso
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.

VOTEZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZ

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

Les Membres Club peuvent 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()

 Sources du même auteur

CONVERTIR CHEMIN RELATIF EN CHEMIN ABSOLUE (POUR DISQUE DUR)
SSCANF POUR SUPPRIMER DES ESPACES (COMME TRIM())
RECUPERER LE DNS DU SERVEUR MX MAIL D'UNE ADRESSE EMAIL
LISTE CHAINÉE (TEMPLATE, NOEUD LOCAL OU GLOBAL, INSERTION OU...
Source avec Zip ENCORE UN PARSER XML

 Sources de la même categorie

COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF par Renfield
Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture [WIN32][VC++6] FILESENDER par MuPuF

Commentaires et avis

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.

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.

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.

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.

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.

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).

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.

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

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)

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

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, ....)

Commentaire de darkpoulpo le 29/04/2005 11:26:24

dit moi ce qui ton probleme, ce sera mieux

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

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é?

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

Commentaire de CChargy le 30/04/2005 14:52:22

Merci
J'espère que ca va marcher

Commentaire de darkpoulpo le 30/04/2005 17:22:37

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

Commentaire de satellite34 le 21/09/2005 18:00:31

bienbien

j' ai bien kiffé :-)

8/10

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"

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

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

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

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

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales