Почему этот вызов QFtp.put вызывает сбой? - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь загрузить файл .avi на FTP-сервер с помощью QFtp:

void MyFTP::recordingDone(QString &fileName){
remainingFiles.push_back(new QString(fileName));

commands[qftp.connectToHost(globalProperties.ftpServer)] = "connect to host";
commands[qftp.login(globalProperties.ftpUsername,globalProperties.ftpPassword)] = "login";
commands[qftp.cd("myapp")] = "cd myapp";
commands[qftp.cd("Videos")] = "cd videos";    
QDir().cd(globalProperties.videoStorageLocation);
qDebug()<<"Opening "<<fileName<<endl;
if(QFile::exists(fileName)){
    qDebug()<<"File exists"<<endl;
}
else{
    qDebug()<<"File does not exist"<<endl;
}
QFile file(fileName);
qDebug()<<"putting"<<endl;
qftp.put(&file,fileName);
qDebug()<<"Closing ftp"<<endl;
qftp.close();
}

Я подключен к сигналу готовности команды и использую слот для отладки выходной информации:

void TrusionFTP::ftpCommandDone(int id, bool error){    
qDebug()<<"command: "<<commands[id]<<": "<<error;
if(error){
    qDebug()<<qftp.errorString()<<endl;
    if (qftp.hasPendingCommands()){
        qDebug()<<"Pending commands"<<endl;
    }
}
}

Вот вывод до сбоя:

Opening  "2012-Mar-06-12-19-57.avi" 

File exists 

putting 

Closing ftp 

command:  "connect to host" :  false 
command:  "login" :  false 
command:  "cd trusion" :  false 
command:  "cd videos" :  false 

Сбой также происходит, если я не закрываю соединение ftp. Файл никогда не попадает на сервер.

1 Ответ

5 голосов
/ 07 марта 2012
QFile file(fileName); 
ids.push_back(qftp.put(&file,fileName)); 

file находится в стеке. Время жизни file заканчивается, как только возвращается функция-член void MyFTP::recordingDone(QString &fileName). Но у qftp есть ссылка на него. Вероятно, это вызывает сбой при попытке доступа к file, который больше не существует. Вместо этого выделите file в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...