2012-07-08 6 views
0

J'ai un problème avec QFtp. Je veux télécharger un seul fichier .txt avec une seule ligne (8 octets) de mon serveur, donc j'ai écrit le code suivant, mais cela ne fonctionne pas. Le fichier "actions.txt" a été créé dans le répertoire folder1. Je vois assez bien la taille du côté client. Mais le fichier n'est pas en cours d'écriture. Je reçois un fichier vide.Télécharger un seul fichier .txt en utilisant QFtp

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(); 
} 

Merci d'avance.

+0

Voulez-vous dire de spécifier le type de transfert comme 'Ascii' dans l'appel de' QFtp :: get'? (Je suppose que 'action.txt' est un fichier texte ASCII.) Aussi, vous pourriez vouloir regarder la documentation pour' QFtp :: get'; la documentation que j'ai trouvée pour cela indique qu'il démarre une opération asynchrone, et peut retourner avant qu'il ne soit terminé. Vous devrez peut-être attendre qu'il se termine avant de fermer la connexion et le fichier de sortie. – reuben

+0

Déjà essayé le type de transfert Ascii, ne fonctionne toujours pas. Et j'ai essayé de ne pas fermer le fichier du tout. Et aussi la fermeture après un certain temps. Merci pour l'aide de toute façon. –

Répondre

1

La documentation de plusieurs méthodes de QFtp Says:

La fonction ne bloque pas et retourne immédiatement. La commande est planifiée et son exécution est effectuée de manière asynchrone. La fonction renvoie un identifiant unique qui est passé par commandStarted() et commandFinished().

Vous devez donc attendre que les signaux appropriés soient émis.

Notez que vous pouvez également utiliser QNetworkRequest pour demander toute l'URL ftp (je pense même avec nom d'utilisateur et mot de passe dans l'URL) pour télécharger le fichier.

+0

Comme je l'ai dit plus haut, j'ai déjà essayé de supprimer le fichier .close() et ne fonctionnait pas. –

+1

@PatrickBassut Ce n'est absolument pas ce dont je parle ... Je parle d'écouter les signaux au lieu de simplement écrire les commandes FTP les unes après les autres. Ils ** tous ** sont non-bloquants, ce qui signifie qu'ils sont exécutés de manière asynchrone, donc pour que le fichier soit écrit, vous devez attendre le signal 'commandFinished()' qui transmet l'ID que vous avez obtenu 'QFtp :: get() '. – leemes

+0

+1. Merci pour l'aide, parce que c'est ce que j'ai fait. –

0

J'ai résolu mon problème. J'ai traité une étape chaque fois que le signal commandFininshed était émis. comme ceci:

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; 
    } 
} 

la raison de la variable de drapeau est quelque chose d'autre qui a besoin d'explications supplémentaires au sujet du programme, je ne vais pas aller dans cette voie.

Merci pour votre aide. Cela m'a beaucoup aidé.

Questions connexes