Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
956 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Récupération du nom de fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récupération du nom de fichier

n°1361404
lynxia
Qui? Bah oui, bah...eh! ^^
Posté le 07-05-2006 à 19:03:51  profilanswer
 

Bonjour,
 
J'ai un client qui se connecte à mon serveur pour lui transférer un fichier texte.
Voici un extrait du code client lors du transfert du fichier:
 

Code :
  1. tmp = getenv ("COMPUTERNAME" );
  2. sprintf (chemin, "config_%s.txt",tmp);
  3. fichier = fopen(chemin,"r" ); //Ouverture en lecture seule en mode txt
  4.         if(fichier == NULL) { // verification de l'ouverture correcte du fichier
  5.         printf("Erreur lors l'ouverture du fichier\n" );
  6.         exit(-1); // Sortir avec le code erreur -1
  7.                             }
  8. fseek(fichier,0,SEEK_END ); // Placement du pointeur en fin de fichier
  9. size=ftell(fichier); // Recuperation dans la variable taille de la position du pointeur (donne la tailel du fichier)
  10. fseek(fichier,0,SEEK_SET);  // Placement du pointeur en debut de fichier
  11. fread(buffer,65535,1,fichier); // Lecture du fichier
  12. nb_caracteres = send(sock,buffer,size,0); //Envoi des donnees
  13. fclose (fichier); // Fermeture du fichier
  14. if (nb_caracteres==SOCKET_ERROR) { // Test du nombre de caractères
  15.         printf("Transfert du fichier impossible, erreur : %d\n",WSAGetLastError()); // Affichage du code erreur


 
J'aimerais que mon serveur récupère exactement le même nom de fichier que le client lui aura transféré.
Je pensais créer une variable "nomfichier" dans mon code serveur dans laquelle je stockerais "chemin" issu du client, mais je ne vois pas comment faire.
 
Ca fonctionne bien si je précise manuellement le chemin dans mon code serveur, mais j'aimerais pouvoir faire

Code :
  1. fichier = fopen(nomfichier,"w" )

avec nomfichier = chemin

mood
Publicité
Posté le 07-05-2006 à 19:03:51  profilanswer
 

n°1361406
Taz
bisounours-codeur
Posté le 07-05-2006 à 19:13:22  profilanswer
 

#
fread(buffer,65535,1,fichier); // Lecture du fichier
 
et si size > 65535 ?
 
 
la solution à ton problème : transférer le nom du fichier, c'est tout.

n°1361445
lynxia
Qui? Bah oui, bah...eh! ^^
Posté le 07-05-2006 à 20:41:24  profilanswer
 

Donc l'utilisation des fonctions recv() et send() suffit?

n°1361458
Taz
bisounours-codeur
Posté le 07-05-2006 à 21:52:40  profilanswer
 

bien sur.

n°1361459
Taz
bisounours-codeur
Posté le 07-05-2006 à 21:53:35  profilanswer
 

si ton OS le permet, tu peux aussi utiliser sendfile pour transférer des fichiers.

n°1361523
lynxia
Qui? Bah oui, bah...eh! ^^
Posté le 08-05-2006 à 01:52:44  profilanswer
 

Merci  :jap:  

n°1361613
Sve@r
Posté le 08-05-2006 à 11:59:51  profilanswer
 

lynxia a écrit :

Code :
  1. fread(buffer,65535,1,fichier); // Lecture du fichier
  2. nb_caracteres = send(sock,buffer,size,0); //Envoi des donnees




 
Comme l'a dit Taz, si jamais ton fichier fait plus de 65535 octets, tu ne le récupèreras pas en entier. En plus, il me semble que "fread" travaille en signé donc il s'arrête à 32767 (c'est à vérifier). Bon, de toute façon, quelle que soit la limite t'es coincée si ton fichier la dépasse
Il faut que ton client fasse une boucle de lecture et d'envoi sur la socket

Code :
  1. while ((nbLu=fread(buffer, 1, N, fichier)) > 0)
  2.       send(sock, buffer, nbLu, 0);


 
Et que ton serveur fasse une boucle de réception de la socket et d'écriture

Code :
  1. while ((nbLu=recv(sock, buffer, N, 0)) > 0)
  2.       fwrite(buffer, 1, nbLu, fichier);


Le "N" étant une constante pouvant être définie à la valeur que tu veux (de 1 à 65535)
 
Quand au nom du fichier, il sera évidemment transmis en tout premier sur le serveur...


Message édité par Sve@r le 08-05-2006 à 12:00:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1361622
Taz
bisounours-codeur
Posté le 08-05-2006 à 12:19:06  profilanswer
 

Citation :

En plus, il me semble que "fread" travaille en signé donc il s'arrête à 32767 (c'est à vérifier)

size_t est non signé. et même sur une machine 16bits, tu peux lire avec fread 2**32 octets.


Message édité par Taz le 08-05-2006 à 12:19:33
n°1361868
lynxia
Qui? Bah oui, bah...eh! ^^
Posté le 08-05-2006 à 17:46:04  profilanswer
 

Merci à vous :)
 
Mais.. hmm je ne comprends pas bien la constante N, ça change rien que je mette 1 ou 65535?

n°1361878
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-05-2006 à 17:54:11  profilanswer
 

lynxia a écrit :

Merci à vous :)
 
Mais.. hmm je ne comprends pas bien la constante N, ça change rien que je mette 1 ou 65535?


doit être < à la taille de buffer ...


Message édité par Emmanuel Delahaye le 08-05-2006 à 17:54:59

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 08-05-2006 à 17:54:11  profilanswer
 

n°1361991
Sve@r
Posté le 08-05-2006 à 20:48:40  profilanswer
 

lynxia a écrit :

Mais.. hmm je ne comprends pas bien la constante N, ça change rien que je mette 1 ou 65535?


 
C'est juste une constante qui donne le nb d'octets que tu liras à chaque boucle
Tu la définis comme tu veux (ex: #define N          1000) mais elle influera sur la mémoire et le temps d'exécution de la boucle.
 
Si elle est définie à 1, tu lis le fichier octet par octet et tu écris sur la socket octet par octet. C'est long mais ça ne consomme pas de mémoire.
Si elle est définie à 65535, ta boucle utilise 65535 fois plus de mémoire mais fait 65535 fois moins d'itérations.
Ensuite, c'est une question de compromis qui dépend souvent de la machine qui exécute ton pgm...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1361997
lynxia
Qui? Bah oui, bah...eh! ^^
Posté le 08-05-2006 à 20:50:27  profilanswer
 

Ok merci je comprends mieux :)

n°1362000
Sve@r
Posté le 08-05-2006 à 20:53:11  profilanswer
 

lynxia a écrit :

Ok merci je comprends mieux :)


Bien entendu, il te faut aussi définir ton buffer ainsi

Code :
  1. char buffer[N];

Message cité 1 fois
Message édité par Sve@r le 08-05-2006 à 20:54:11

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1362076
lynxia
Qui? Bah oui, bah...eh! ^^
Posté le 08-05-2006 à 23:31:50  profilanswer
 

Sve@r a écrit :

Bien entendu, il te faut aussi définir ton buffer ainsi

Code :
  1. char buffer[N];



 
Vi :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Récupération du nom de fichier

 

Sujets relatifs
[BATCH]Recuperation informations fichierRécupération des éléments d'un fichier xml en flux retour
Recuperation fichier via HTTPRécupération d'une liste de fichier dans un Array
Récupération de variable à partir d'un fichier .txtRécupération d'une donnée d'un fichier
Récupération de x fois 4 lignes dans un fichier logProbleme avec recuperation de Fichier ZIP
récupération de noms de fichier[SCRIPT] recuperation d information dans une fichier TXT
Plus de sujets relatifs à : Récupération du nom de fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR