2009-07-30 8 views
9

Tôi đang tải xuống tệp bằng QNetworkAccessManager :: nhận được nhưng không giống như QHttp :: không có cách tích hợp để ghi trực tiếp phản hồi vào một QIODevice khác.Viết QNetworkReply vào một tệp

Cách đơn giản nhất sẽ được để làm một cái gì đó như thế này:

QIODevice* device; 

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

và sau đó trong newData khe:

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

Nhưng tôi không chắc chắn nếu điều này là đúng cách, có lẽ tôi Bỏ lỡ gì đó.

Trả lời

7

Điều đó có vẻ chính xác. Tôi sẽ sử dụng các biểu mẫu cấp thấp hơn là read()write(), không phải là các hình thức QByteArray, không hỗ trợ xử lý lỗi đúng cách, nhưng ngoài ra, nó có vẻ ổn.

Bạn đang gặp sự cố với nó?

+0

Tôi chưa gặp phải bất kỳ sự cố nào nhưng tôi lo lắng rằng nếu tôi có một lượng lớn tải xuống song song, toàn bộ hoạt động này có thể gây ra cổ chai. –

+1

Không chắc chắn, nhưng có thể. Bạn có thể tối ưu hóa bằng cách sử dụng một chồng 'char buffer [4098]' để tránh 'malloc() s' liên quan đến việc tạo ra' QByteArray'. Cũng có 'QVarLengthArray'. –

+0

yeah đó là những gì tôi đã làm với mảng char cục bộ. Cảm ơn bạn đã giúp đỡ. –

-1

Sử dụng tốt hơn tín hiệu đã hoàn thành để đọc tất cả nội dung ở cuối quá trình tải xuống. Ví dụ (loại bỏ vòng lặp sự kiện và sử dụng một vị trí mới để làm cho nó không đồng bộ):

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

điều này có thể gây ra một số vấn đề nghiêm trọng về bộ nhớ/hiệu suất khi xử lý các yêu cầu lớn –