2009-07-30 10 views
9

Estoy descargando un archivo usando QNetworkAccessManager :: get pero a diferencia de QHttp :: get no hay una forma incorporada de escribir directamente la respuesta a un QIODevice diferente.Escribiendo un QNetworkReply en un archivo

La forma más sencilla sería la de hacer algo como esto:

QIODevice* device; 

QNetworkReply* reply = manager.get(url); 
connect(reply, SIGNAL(readyRead()), this, SLOT(newData())); 

y luego en la ranura newData:

device->write(reply->readAll()); 

Pero no estoy seguro de si este es el camino correcto, tal vez perdido algo

Respuesta

7

Eso parece correcto. Utilizaría los formularios de nivel inferior de read() y write(), no los QByteArray, que no admiten correctamente el manejo de errores, pero aparte de eso, se ve bien.

¿Estás teniendo problemas con él?

+0

no he encontré con ningún problema hasta ahora, pero me preocupa que si tengo una gran cantidad de descargas paralelas, toda esta operación puede causar un cuello de botella. –

+1

Poco probable, pero posible. Puede optimizar utilizando una pila 'char buffer [4098]' para evitar el 'malloc() s' involucrado en la creación' QByteArray'. También hay 'QVarLengthArray'. –

+0

Sí, eso es lo que hice con la matriz de caracteres local. gracias por tu ayuda. –

-1

Mejor utilizar la señal terminada para leer todos los contenidos al final del proceso de descarga. Un ejemplo (quitar el bucle de eventos y utilizar una nueva ranura para que sea asíncrono):

QNetworkAccessManager manager; 
    QEventLoop loop; 
    QNetworkReply *reply = manager.get(request); 
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); 

    loop.exec(); 

    QFile file("YOUR FILE"); 
    file.open(QIODevice::WriteOnly); 
    file.write(reply->readAll()); 

    delete reply; 
+7

esto puede causar algunos problemas graves de memoria/rendimiento cuando se trata de grandes solicitudes –

Cuestiones relacionadas