Estoy haciendo una descarga de archivos con libcurl en mi programa de C++. ¿Cómo puedo detectar si la solicitud es un 404 y no escribir el archivo? El código es:detección de libcurl 404
void GameImage::DownloadImage(string file_name) {
string game_name;
game_name = file_name.substr(file_name.find_last_of("/")+1);
CURL *curl;
FILE *fp;
CURLcode res;
string url = "http://site/"+game_name+".png";
string outfilename = file_name+".png";
cout<<"INFO; attempting to download "<<url<<"..."<<endl;
curl = curl_easy_init();
if (curl) {
cout<<"INFO; downloading "<<url<<"..."<<endl;
fp = fopen(outfilename.c_str(), "wb");
cout<<"INFO; trying to open "<<outfilename<<" for file output"<<endl;
if (fp != NULL) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, GameImage::WriteData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
res = curl_easy_perform(curl);
long http_code = 0;
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
curl_easy_cleanup(curl);
fclose(fp);
}
else {
cout<<"GameImage::DownloadImage; Couldn't open output file"<<endl;
}
}
}
size_t GameImage::WriteData(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
Puedo eliminar la respuesta 404 después de la transferencia, pero sería bueno ni siquiera guardar la respuesta.
Todavía obtengo un archivo, pero está vacío ahora. Agregué curl_easy_setopt (curl, CURLOPT_FAILONERROR, verdadero); No me importa que haya ocurrido un error, simplemente no quiero que se quede el archivo. – zombor
¿Puedes actualizar tu pregunta con tu código como está ahora? – Alex
Hecho. Creo que es debido a la inicial fp = fopen (outfilename.c_str(), "wb"); que crea el manejador de archivo. – zombor