-1

项目背景-> 我必须远程升级 Linux 嵌入式系统。这需要将 tar 球文件从 Windows Qt 应用程序传输到通过以太网电缆连接的 Linux 盒子。Linux 机器有固定的 IP 地址。

到目前为止我所做的-> 作为 Qt 的完全新手,我创建了一个对话框来浏览文件并检查 tar 球文件。

问题-> 现在我希望当我单击另一个按钮时,比如Upgrade,它应该将文件从 Windows 传输到 Linux 框(具有固定 IP 地址)并执行包含如何升级不同文件的代码的 bash 脚本。

请问各位大神,我将如何将文件从 Windows 发送到 Linux 机器。我查看了 Qt 的 FTP 客户端,我猜它下载文件而不是传输文件。

谢谢和问候,
山姆

4

2 回答 2

1

QFtp 和 QNetworkAccessManager 类都可以将文件上传到 FTP 服务器。QNetworkAccessManager 类比 QFtp 更适合您的工作。但是,它需要在您的 linux 机器上进行特定设置。
您还可以使用 TCP Socket 连接传输文件(请参阅类QTcpServerQTcpSocket),这也需要在 linux 上运行其他应用程序。因此,如果您想自动化该过程,我想您可以编写一个 Qt 应用程序,将文件上传到您的 linux 机器上运行的 FTP 服务器上,或者创建两个可以作为客户端和服务器工作的简单应用程序。

于 2012-06-06T12:17:49.347 回答
0

1)我的批处理脚本说 upgrade.bat 接受 2 个参数,如 ip 地址,升级 tar 球,然后使用 putty.exe 将文件传输到通过以太网电缆连接的 linux 机器。
bat 脚本中的示例

pscp -pw "blabla" "%TARGET_UPDATE_FILE%" user@"%TARGET_IP%":"%BASE_DIR%"/

其中 target_update_file = tar 球文件从 Qt 接受,目标 ip = ip 地址作为参数从 qt 接收到 bat 文件。

现在在 qt 上,在升级按钮代码中

void Qt_test::ReadOut()     
{       
     QProcess *processInfo = dynamic_cast< QProcess* >( sender() );

   if( processInfo )
     {
       ui->upgrade_info->append( processInfo->readAllStandardOutput() );
     }        
 }    

void Qt_test::ReadError()
{
     QProcess *processInfo = dynamic_cast< QProcess* >( sender() );

    if( processInfo )
   {
       ui->upgrade_info->append( processInfo->readAllStandardError() );
   }
 }

void Qt_test::on_file_browse_clicked()
{
     ui->selected_file->setText( QFileDialog::getOpenFileName( this, tr( "Open File" ),
                                                        "/home",
                                                        tr( "Upgrade file ( *.tar.gz )"     ) ) );
 }

void  Qt_test::on_file_upgrade_clicked()
 {
        QFileInfo upgradeFileInfo( ui->selected_file->text() );
        if( !upgradeFileInfo.exists() )
       {
             QMessageBox::information( this, tr( "Information" ),
                             tr( "Unable to find file for upgrading!" ) );
            return;
       }     

    QString batchPath= QDir::currentPath() + "\\testUpgrade.bat" ;
    QFileInfo batchFile( batchPath ) ;
    if( !batchFile.exists() )
    {
             QMessageBox::information( this, tr( "Information" ),
                             tr("Failed to find the upgrade batch file....... ") ) ;
         return;
     }

    //Check if cmd.exe is present in Clients system and is located at correct path
       QFileInfo cmdFile( "C:\\Windows\\system32\\cmd.exe");
     if( !cmdFile.exists() )
      {
           QMessageBox::information( this, tr( "Information" ),
                             tr("Failed to find the cmd.exe ... Check cmd.exe is   installed and is in  C:\\Windows\\system32\\ !") ) ;
          return;
      }

     QFileInfo puttyFile( "C:\\Windows\\system32\\putty.exe");
     if( !puttyFile.exists() )
     {
           QMessageBox::information( this, tr( "Information" ),
                              tr("Failed to find the putty.exe ... Check putty.exe(ideally version 0.62.0.0) is installed and is in  C:\\Windows\\system32\\ !") ) ;
          return;
     }

      QFileInfo plinkFile( "C:\\Windows\\system32\\plink.exe");
     if( !plinkFile.exists() )
     {
          QMessageBox::information( this, tr( "Information" ),
                              tr("Failed to find the plink.exe ... Check plink.exe(ideally version 0.62.0.0) is installed and is in  C:\\Windows\\system32\\ !") ) ;
          return;
     }

    QString upgradeFile =   upgradeFileInfo.absoluteFilePath();
   QString ipAddress   =   ui->selected_ip->text();
    qDebug() << " checksum valu is " <<checkSum.count() ;
    QStringList arguments ;

    arguments << " /c" << batchFile.absoluteFilePath()<< upgradeFile << ipAddress ;
   // copying update
   QProcess *processUpgrade = new QProcess( this );
   if( processUpgrade )
    {   std::cout <<" starting to upgrade " << std::endl ;

       processUpgrade->setEnvironment( QProcess::systemEnvironment() )  ;
       processUpgrade->setProcessChannelMode( QProcess::MergedChannels ) ;

        processUpgrade->start( cmdFile.absoluteFilePath(), arguments ) ;
        processUpgrade->waitForStarted() ;
        connect( processUpgrade, SIGNAL( readyReadStandardOutput() ), this, SLOT( ReadOut() ) ) ;
          connect( processUpgrade, SIGNAL( readyReadStandardError()  ), this, SLOT( ReadErr() ) ) ;
  }
 }
于 2012-06-20T15:05:49.300 回答