2009-07-30 20 views
9

Pobierałem plik za pomocą QNetworkAccessManager :: get, ale w przeciwieństwie do QHttp :: get nie ma wbudowanego sposobu bezpośredniego zapisu odpowiedzi na inną QIODevice.Zapisywanie QNetworkReply do pliku

Najłatwiej byłoby zrobić coś takiego:

QIODevice* device; 

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

a następnie w newData gniazda:

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

Ale nie jestem pewien, czy jest to właściwy sposób, może coś przeoczyłem.

Odpowiedz

7

To wygląda poprawnie. Używałbym form niższego poziomu read() i write(), a nie QByteArray, które nie obsługują poprawnie obsługi błędów, ale poza tym, wygląda dobrze.

Masz z tym problemy?

+0

ja nie wpadł dotąd żadnych problemów, ale obawiam się, że jeżeli mam dużą ilość równoległych pobrania, cała ta operacja może spowodować szyjkę butelki. –

+1

Mało prawdopodobne, ale możliwe. Możesz zoptymalizować za pomocą stosu 'char buffer [4098]', aby uniknąć 'malloc() s' zaangażowanego w tworzenie' QByteArray'. Istnieje również 'QVarLengthArray'. –

+0

Tak, właśnie to zrobiłem w lokalnej tablicy char. dzięki za pomoc. –

-1

Lepiej wykorzystaj gotowy sygnał, aby przeczytać całą zawartość na końcu procesu pobierania. Przykładem (usunąć pętlę zdarzeń i użyć nowego gniazda, aby go asynchroniczny):

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

może to spowodować poważne problemy z pamięcią/wydajnością w przypadku dużych żądań –