2012-07-08 111 views
0

我遇到了QFtp的问题。我想用我的服务器中的一行(8字节)下载一个.txt文件,所以我写了下面的代码,但它不起作用。 文件“actions.txt”是在folder1目录中创建的。我可以在客户端看到它的大小。但该文件没有被写入。我收到一个空文件。使用QFtp下载单个.txt文件

QFile* actionFile = new QFile("action.txt"); 
QFtp *ftp = new QFtp(parent); 

void Dialog::getActionFile() 
{ 
    actionFile->open(QIODevice::WriteOnly); 
    ftp->connectToHost("mydomain.de"); 
    ftp->login("user", "pw"); 
    ftp->cd("folder1"); 
    ftp->get("action.txt",actionFile); 
    ftp->close(); 
    actionFile->close(); 
} 

在此先感谢。

+0

你是不是想在调用'QFtp :: get'的时候指定传输类型为'Ascii'? (我假设'action.txt'是一个ASCII文本文件。)另外,你可能想看看'QFtp :: get'的文档;我发现它的文档表明它启动了一个异步操作,并可能在它完成之前返回。在关闭连接和输出文件之前,您可能需要等待它完成。 – reuben 2012-07-08 21:54:39

+0

已经尝试了Ascii传输类型,仍然没有工作。我试图根本不关闭文件。并在一段时间后关闭。无论如何,感谢您的帮助。 – 2012-07-08 22:25:34

回答

1

几种方法的QFtp说的文档:

功能不会阻止,并立即返回。该命令是预定的 ,并且它的执行是异步执行的。函数 返回一个由commandStarted()commandFinished()传递的唯一标识符。

所以你需要等待适当的信号发射。

请注意,您也可以使用QNetworkRequest来请求整个ftp URL(我认为即使使用URL内的用户名和密码)来下载文件。

+0

正如我上面所说,我艾尔雷迪试图删除file.close()并没有奏效。 – 2012-07-09 04:00:39

+1

@PatrickBassut这绝对不是我正在谈论的......我谈论的是听信号,而不是一个接一个地写FTP命令。它们都是非阻塞的,也就是说,它们是异步执行的,所以为了写入文件,你需要等待信号'commandFinished()',它传递你从'QFtp :: get ()'。 – leemes 2012-07-09 09:43:03

+0

+1。感谢您的帮助,因为这就是我所做的。 – 2012-07-09 18:26:23

0

我解决了我的问题。 每次发出commandFininshed信号,我都会处理一个步骤。 这样的:

void MainWindow::ftpCommandFinished(int id, bool error) 
{ 
    static bool flag = false; 
    if(ftp->currentCommand() == QFtp::ConnectToHost) 
     checkUpdate(); 
    if(ftp->currentCommand() == QFtp::Get) 
    { 
     file->close(); 
     if(error) 
     { 
      QMessageBox::warning(this, "Erro!", ftp->errorString()); 
      deleteLater(); 
      return; 
     } 
     if(!flag) 
      checkVersion(); 
     else{ 
      delete ftp, file; 
      ftp = 0; file = 0; 
     } 
     flag = true; 
    } 
} 

的标志变量的原因是别的东西,需要了解该计划的进一步解释,所以我不会走这一步。

感谢您的帮助。它以某种方式帮助了我很多。