IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau Discussion :

Problème avec QFtp


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 42
    Par défaut Problème avec QFtp
    Bonjour,

    J'ai un problème avec mon code pour l'envoi de fichier FTP.

    J'essaye d'envoyer des fichiers répartis dans un dossier puis un sous dossier.
    Mon problème c'est qu'il envoi les fichiers dans le sous dossier, mais n'envoie jamais ceux du dossier.

    Au niveau du déplacement dans les dossiers je pense ne pas mettre trompé pourtant, j'ai testé sans utilisé l'FTP pour voir les chemins parcourus et visiblement il passe par tous.
    De plus, j'ai utilisé des fichiers pour vérifier les passages avec l'FTP et d'après les contrôles il est censé envoyé tout les fichiers.

    Bref, voici le code de la fonction d'envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void  FTP::envoi(QStringList list, QString dossier)
    {
        ftp->mkdir(dossier);
        ftp->cd(dossier);
     
        for(int i=0; i<list.count(); i++)
        {
            QFileInfo *fileInfo = new QFileInfo(list.value(i));
            if(!(fileInfo->isDir()))
            {
                QFile *file = new QFile(fileInfo->filePath());
                ftp->put(file,fileInfo->fileName());
                QMessageBox::information(this,dossier,"FILE : "+fileInfo->filePath());
            }
            else
            {
                QDir *dir = new QDir(fileInfo->filePath());
                envoi(watchList(dir),fileInfo->fileName());
                ftp->cd("..");
            }
        }
    }
    Merci d'avance de votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Bonsoir,

    Le fait que ta fonction parcourt le premier dossier dépend surtout de la façon dont elle est appelée la première fois.

    Par contre,
    • tu alloues des pointeurs sans les libérer => fuite de mémoire,
    • QDir et QFileInfo ne devraient pas être alloués dynamiquement,
    • QDirIterator permet de récupérer la liste des fichiers d'un répertoire récursivement sans récursion dans le code,
    • tu ouvres tous les fichiers en même temps, alors que tu pourrais ouvrir et fermer les fichiers dans le slot connecté au signal commandFinished. Ça permettait en plus de gérer les erreurs éventuelles au moment où elles arrivent.
    On peut passer un chemin complet à put et mkdir (ex: ftp->mkdir("toto") puis ftp->mkdir("toto/tata") puis ftp->put(..., "toto/tata/fichier.txt")), donc sans utiliser cd à chaque fois.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 42
    Par défaut
    Merci pour cette réponse.

    Alors j'ai rectifié mes erreurs, fuite de mémoire, QDir, QFileInfo et j'ai utilisé QDirIterator.
    Par contre, bien que ton idée me paraisse intéressante pour l'utilisation des fichiers, je ne vois pas comment faire...
    J'avoue que l'utilisation des slots et signaux avec la class QFtp, ce n'est pas forcément ce que j'ai le plus compris...

    Je vais regarder pour trouver comment faire mais si tu as des explications ce serait avec plaisir.

    Merci d'avance.

    EDIT : Je n'ai pas encore trouvé pour les signaux et slots mais il y a quelque chose que je ne comprends pas.
    J'ai transformé mon code de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void  FTP::envoi()
    {
        QDirIterator dir("/*chemin du dossier*/", QDirIterator::Subdirectories);
        ftp->mkdir(dir.path());
        while(dir.hasNext())
        {
            if(dir.fileName() != QString(".") && dir.fileName() != QString("..") && dir.fileName() != QString(""))
            {
                QFileInfo fileInfo(dir.filePath());
                if(fileInfo.isDir())
                {
                    ftp->mkdir(dir.filePath());
                }
                else
                {
                    QFile *file = new QFile(dir.filePath());
                    ftp->put(file,dir.filePath());
                    //file->close();
     
                }
            }
            dir.next();
        }
    }
    Je ne doute pas qu'il y ait encore des problèmes, mais mon soucis majeur et que j'ai réussi, sur une vingtaine d'essais, à avoir deux fois le résultat escompté, soit tout mes fichiers étaient transférés . La plupart du temps, les fichiers transférés sont uniquement ceux du sous dossier, et d'autres fois je n'ai rien du tout.

    Bref, je suppose que des erreurs sont encore là et engendre le problème alors merci d'avance de votre aide...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Tu peux par exemple avoir la structure suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class FTP : public QObject ou QWidget {
    ...
    private:
      // réutilisable après close()/setFileName()
      QFile currentFile; 
      // non réutilisable, donc un pointeur
      QScopedPointer<QDirIterator> dirIterator; 
     
    public slots:
      void  envoi(const QString & dossier) {
          // lance le premier put ou mkdir
      }
    private slots:
      void onCommandFinished(int id, bool error) {
        if (error)  {
           // Affiche l'erreur puis quitte
           return;
        }
     
        if (ftp->currentCommand() == QFtp::Put ||
            ftp->currentCommand() == QFtp::Mkdir) {
            // Lance le fichier ou répertoire suivant s'il y en a un 
        }
      }
    };
    EDIT:
    Bref, je suppose que des erreurs sont encore là et engendre le problème alors merci d'avance de votre aide...
    Il faut vérifier qu'il n'y a pas eu d'erreur lors d'une des opérations, parce que si c'est le cas toutes les opérations suivantes déjà présentes dans la file d'attente sont annulées.
    L'erreur est indiquée par QFtp::error() ou QFtp::errorString() dans le slot connecté au signal commandFinished(int,bool).

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 42
    Par défaut
    Dans mon slot appelé par le signal commandFinished je teste le booléen et affiche l'erreur avec QFtp->error() si elle a lieu.

    J'ai également le signal QFtp::done de connecté.

    Malheureusement je n'ai aucun retour comme quoi une erreur s'est produite...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Je ne sais pas si c'est dû à ça, mais d'après le code de QFtp et après quelques tests, si QFtp n'arrive pas à ouvrir le fichier lui-même, il arrête de traiter les commandes suivantes, sans signaler aucune erreur.
    Essaye d'ouvrir les fichiers et de tester leur bonne ouverture avant de les passer à ftp->put.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 42
    Par défaut
    J'ai corrigé ma condition, bête erreur de copier/coller...

    Je n'ai aucun message d'erreur lors de l'ouverture des fichiers.

    Sans destruction, j'obtiens 7fichiers sur 9 téléchargés du premier sous-dossier.
    Quand je détruis le fichier dans la fin d'execution, l'application plante.

    Il faut que je rajoute dans le slot de fin d'execution :
    ??

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Par défaut
    Plutôt quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* dans le slot connecté à commandFinished */
    if (ftp->currentCommand() == QFtp::Put) {
       QFile *file = static_cast<QFile*>(ftp->currentDevice());
       if(file) {
          file->deleteLater();
       }
    }

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo