[C] Tranfert de fichiers par FTP : problème

Résolu/Fermé
Vinc14 Messages postés 52 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 31 janvier 2012 - 10 déc. 2008 à 16:13
Vinc14 Messages postés 52 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 31 janvier 2012 - 10 déc. 2008 à 18:50
Bonjour,
Je travaille sur une application en C utilisant l'API Win32. Cette application ne sert pas à grand chose, je l'ai créée juste pour ne pas perdre la main. Dans ce programme, j'ai créé une fonction pour la réception de fichiers par FTP basée sur des fonctions de l'api Win32, et elle ne fonctionne pas... Alors que cette même fonction, dans un autre programme, fonctionne parfaitement ! Voici la partie de mon programme qui ne fonctionne pas :

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <wininet.h>


/* Des prototypes de fonctions */
int RecvFile(char rFileName[], char emplacement[]);

char ftpHost[255] = {0}, ftpUser[255] = {0}, ftpPass[255] = {0}; // Variables globales : doivent être accessibles par toutes les fonctions, notamment main et RecvFile
FILE *fileRapport = NULL; // Le fichier de rapport doit être accessible à toutes les fonctions

int main(int argc, char *argv[])
{
// Variables à déclarer : nom des fichiers d'infos, fichier instr local, fichier rapport local, fichier instr distant, fichier rapport distant
// fichiers infos, rapport, instructions
char infosFileName[255] = {0}, ligneLue[1024] = {0};
char instrLocalFileName[255] = {0}, rapLocalFileName[255] = {0}, instrRemoteFileName[255] = {0}, rapRemoteFileName[255] = {0};
char instruction[255] = {0}, param1[255] = {0}, param2[255] = {0};
FILE *fileInfos = NULL, *fileInstr = NULL;
int SendRapport = 0; // Booléan qui détermine si on doit envoyer le rapport ou non

// Ouverture du fichier d'infos. Le nom / emplacement de ce fichier est argc[1] s'il existe, sinon c'est "infos.txt" par défaut
if(argc > 1)
sprintf(infosFileName, "%s", argv[1]);
else
sprintf(infosFileName, "infos.txt");

fileInfos = fopen(infosFileName, "rb");

// Si il est impossible d'ouvrir le fichier d'informations, on quitte
if(fileInfos == NULL) exit(0);

// Une fois le fichier ouvert, on récupère les infos. Infos séparées par des pipes |
fgets(ligneLue, sizeof(ligneLue) / sizeof(char), fileInfos);
sscanf(ligneLue, "%[^'|']|%[^'|']|%[^'|']", ftpHost, ftpUser, ftpPass);
fgets(ligneLue, sizeof(ligneLue) / sizeof(char), fileInfos);
sscanf(ligneLue, "%[^'|']|%[^'|']|%[^'|']|%[^'|']", instrLocalFileName, rapLocalFileName, instrRemoteFileName, rapRemoteFileName);
fclose(fileInfos);

// Ouverture du fichier de rapport
fileRapport = fopen(rapLocalFileName, "wb+");
if(fileRapport == NULL) exit(0);

// Chargement du fichier d'instructions. S'il n'existe pas, on essaie de le dl sur le ftp, si la lecture ne fonctionne toujours pas, on quitte.
fileInstr = fopen(instrLocalFileName, "rb");
if(fileInstr == NULL)
{
RecvFile(instrRemoteFileName, instrLocalFileName);
fileInstr = fopen(instrLocalFileName, "rb");
if(fileInstr == NULL)
{
fclose(fileRapport);
exit(0);
}
}
[...] fin du main [...]
}

int RecvFile(char rFileName[], char emplacement[])
{
HANDLE hdl, ftphdl;
hdl=InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hdl==NULL) {
fprintf(fileRapport, "Impossible d'ouvrir une connexion\n");
return 0;
}
ftphdl=InternetConnect(hdl, ftpHost, 21, ftpUser, ftpPass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); // handle, host, port, user, pass, ...
if(ftphdl==NULL) {
fprintf(fileRapport, "La connexion au ftp a échoué\n");
return 0;
}
if(FtpGetFile(ftphdl, rFileName, emplacement, 0, 0, FTP_TRANSFER_TYPE_BINARY, 0)==0) {
fprintf(fileRapport, "La réception du fichier distant %s a échoué\n", rFileName);
return 0;
}
InternetCloseHandle(hdl);
fprintf(fileRapport, "Fichier %s bien reçu du ftp et enregistré sous %s\n", rFileName, emplacement);
return 1;
}

Ne me blâmez pas quand à l'utilisation de variables globales, j'ai choisi de faire comme ça, ça n'a aucune influence sur le reste du programme puisqu'il est là juste pour je ne perde pas la main en programmation.
Le fichier d'infos contient notamment l'hôte, le nom d'utilisateur et le mot de passe pour se connecter au FTP, ces 3 informations étant séparées par des pipes (barre verticale |) sur la 1ère ligne. La 2nde ligne n'est pas très importante, elle contient des noms de fichiers.
Le fichier de rapport contient des logs des connexions FTP. À chaque fois que je tente de recevoir un fichier grâce à RecvFile, mon fichier de rapport contient "La réception du fichier distant %s a échoué" (%s est à remplacer par le nom de mon fichier).
Le fichier d'instructions est le fichier que je cherche à récupérer. Dans mon programme, il n'est pas nécessaire d'aller le chercher sur FTP s'il existe déjà.

Le problème est donc le fait que la réception de fichiers avec la fonction RecvFile ne fonctionne pas dans ce programme... Alors qu'elle fonctionne dans un autre programme de test :

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <wininet.h>

#define ftpHost "***********"
#define ftpUser "**************"
#define ftpPass "*************"

int RecvFile(char rFileName[], char emplacement[])
{
HANDLE hdl, ftphdl;
hdl=InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hdl==NULL) {
printf("Impossible d'ouvrir une connexion\n");
return 0;
}
ftphdl=InternetConnect(hdl, ftpHost, 21, ftpUser, ftpPass, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); // handle, host, port, user, pass, ...
if(ftphdl==NULL) {
printf("La connexion au ftp a échoué\n");
return 0;
}
if(FtpGetFile(ftphdl, rFileName, emplacement, 0, 0, FTP_TRANSFER_TYPE_BINARY, 0)==0) {
printf("La réception du fichier distant %s a échoué\n", rFileName);
return 0;
}
InternetCloseHandle(hdl);
printf("Fichier %s bien reçu du ftp et enregistré sous %s\n", rFileName, emplacement);
return 1;
}

int main(int argc, char *argv[])
{
RecvFile("fichier.txt", "fichier.txt");
return 0;
}

-> Fichier fichier.txt bien reçu du ftp et enregistré sous fichier.txt

Je ne comprends pas pourquoi...
Merci d'avance de m'aider à résoudre ce problème.
A voir également:

1 réponse

Vinc14 Messages postés 52 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 31 janvier 2012 1
10 déc. 2008 à 18:50
En fait c'est ma méthode pour récupérer les infos qui foirait... J'ai corrigé ça. Désolé d'avoir posté un message inutile. J'aimerais que ce topic soit supprimé svp...
0