2013-07-15 2 views
3
QNetworkAccessManager *nam = new QNetworkAccessManager(); 
    QUrl url2("ftp://127.0.0.1/test.txt/"); 
    url2.setPassword("12345"); 
    url2.setUserName("user"); 
    QNetworkRequest req(url2); 


    QNetworkReply *reply = nam->get(req); 
    QByteArray data = reply->readAll() ; 
    qDebug() << data ; 

로컬 FTP 서버에 연결하여 파일을 읽지 만 가끔 쓰레기를 가져옵니다.QT QNetworkAccessManager가 작동하지 않는 FTP 서버에서 파일을 다운로드하는 중

+0

http://stackoverflow.com/questions/14111120/qt-code-to-get-list-of-files-from-ftp-server-using-qnetworkaccessmanager - 나는 언제 그들이 들릴지 정확히 들었습니다. 어느 쪽이든 – Huy

답변

5

get()은 GET 요청을 즉시 동 기적으로 수행하지 않고 실제 요청이 나중에 비동기 적으로 수행되는 QNetworkReply 개체 만 생성합니다.

readAll()은 주어진 시간에 사용 가능한 데이터 만 읽지 만 더 많은 데이터를 기다리는 것을 차단하지 않습니다. 생성 직후에는 사용할 수있는 데이터가 없습니다.

connect(reply, SIGNAL(finished()), this, SLOT(requestFinished())); 
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(requestError(QNetworkReply::NetworkError)); 

당신이 다음 readAll()을 사용할 수있는 requestFinished() 슬롯 :

finished()error() 신호에 연결, 모든 데이터가 다운로드 될 때까지 기다릴. 작은 파일 만 downloaing 때 괜찮 작동합니다. 큰 파일을 다운로드 할 때는 readyRead() 신호에 더 잘 연결하고 맨 마지막에 단일 readAll()을 사용하는 대신 증분 청크로 도착 데이터를 처리하십시오.

+0

하지만 간단한 콘솔 앱에서 메인에서 이것을하고 있어요. 슬롯과 시그널을 가진 클래스가 없기 때문에 어떻게 연결합니까? – user2584587

+0

그런 수업을 소개합니다. 그 대안은 많은 사건의 근원 인 지역 이벤트 루프입니다. –

+0

클래스를 만들고 슬롯과 신호를 객체에 연결하여 말했듯이 파일을 읽었을 때 내가 뭘 잘못하고 있니? - 출력을 위해 이것을 얻습니다 --------> "" "" – user2584587

관련 문제