2010-08-05 9 views
0

Je transfère un fichier binaire (.exe) avec FTP en utilisant libcurl, et l'enregistre dans un fichier local. Le problème est qu'après le transfert du fichier, il est modifié et n'est plus une application Win32 valide, et ne fonctionne pas. Voici comment je le fais:Fichiers binaires corrompus après transfert libcurl

CURL *curl; 

curl = curl_easy_init(); 
    FILE* f = fopen("C:\\blah.exe", "w"); 

if(curl) { 
    curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.mysite.com"); 
    curl_easy_setopt(curl, CURLOPT_USERPWD, "blah:blah"); 
    curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_SINGLECWD); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &f); 
} else { 
      fclose(f); 
    return CURL_EASY_INIT_FAIL; 
} 

    fclose(f); 

Le fichier est écrit mais il est plus grand que sur le serveur FTP. Comme je l'ai dit, essayer de l'exécuter entraîne l'erreur "% 1 n'est pas une application Win32 valide". Ai-je oublié de définir une option ou quelque chose?

Répondre

5

Vous avez oublié le drapeau binaire. Ce est le code correct:

FILE* f = fopen("C:\\blah.exe", "wb"); 
+0

WOW MERCI. C'est la réponse. – Nilbert

0

La raison est que vous transférez en ASCII et non binaire. Ainsi, votre fin de ligne pourrait être brisée. Il y a des CR dans le binaire, ils pourraient se transformer en CR LF ou l'inverse. Réglez CURL pour effectuer un transfert binaire.