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

Qt Discussion :

Liste des fichiers à télécharger


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut Liste des fichiers à télécharger
    Bonjour

    Je suis entrain de voir pour faire une liste de fichier à télécharger pour mon updater.
    Donc je fait une requête post et dedans je fais une comparaison avec le md5 pour savoir les fichiers à télécharger ou non.

    Mais la je suis fasse à un problème de logique surtout...

    Je récupère la balise xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <fichier name="QtCore4.dll" dir="" md5="<?php echo md5_file('QtCore4.dll'); ?>" />
    <fichier name="test.dll" dir="test/" md5="<?php echo md5_file('test.dll'); ?>" />
    Donc déjà il faudrait que je fasse le code de tel façon a ce que j'ai le chemin, et le nom du fichier et si possible le md5 pour faire une comparaison quand on déplace le fichier du dossier temporaire au dossier d'installation du programme.

    Donc après je fais une liste sous cette forme :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    QList<QString> listElemAjout;
     
        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
        QXmlStreamReader reader(reply->readAll());
        reader.readNext();
     
        while(!reader.atEnd())
        {
            reader.readNext();
     
            if(reader.error())
            {
                qDebug() << reader.error();
                return;
            }
            if(reader.isStartElement())
            {
                if (reader.name() == "liste_fichiers")
                {
                    while(!(reader.isEndElement() && reader.name().compare("liste_fichiers")==0))
                    {
                        reader.readNext();
     
                        if(reader.isStartElement() && reader.name() == "fichier")
                        {
                            QString attrNAME = reader.attributes().value("name").toString();
                            QString attrDIR = reader.attributes().value("dir").toString();
                            QString attrMD5 = reader.attributes().value("md5").toString().trimmed();
                            QString strNameContrib = reader.readElementText();
     
                            QString cheminDuRepertoire = QCoreApplication::applicationDirPath();
                            QDir repertoire(cheminDuRepertoire);
                            repertoire.setFilter(QDir::NoDotAndDotDot | QDir::Files);
     
                            if(QFile::exists(attrDIR+attrNAME) == false)
                            {
                                listElemAjout.push_back(attrNAME);
                            }
     
                            foreach(QFileInfo fileInfo, repertoire.entryInfoList())
                            {
                                QFile file(fileInfo.absoluteFilePath());
                                file.open(QIODevice::ReadOnly);
                                QByteArray data = file.readAll();
                                QCryptographicHash md5(QCryptographicHash::Md5);
                                md5.addData(data);
                                QByteArray hah = md5.result();
     
                                if(fileInfo.fileName() == attrNAME)
                                {
                                    if(attrNAME.compare(fileInfo.fileName(), Qt::CaseInsensitive) == 0)
                                    {
                                        listElemAjout.push_back(attrNAME);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        // Liste de tout les noms de fichiers à télécharger
        for (int i = 0; i < listElemAjout.size(); i++)
        {
            qDebug() << listElemAjout[i];
        }
     
        reply->deleteLater();
        telechargement_fichier();
    }
     
    void FenUpdater::telechargement_fichier()
    {
        // Boucle pour télécharger tout les fichiers de la liste !
        QNetworkRequest url_requete(QUrl("fichier"));
        QNetworkAccessManager *manager = new QNetworkAccessManager;
        QNetworkReply *reply = manager->get(url_requete);
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(messageErreur(QNetworkReply::NetworkError)));
        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(infos_telechargement_fichier(qint64, qint64)));
        connect(reply, SIGNAL(finished()), this, SLOT(enregistrer()));
    }
    Et ensuite il faudrait que je mets en paramètre la liste pour le slot telechargement_fichier.
    Et la arrive un nouveau problème... Comment tous les télécharger et ensuite aller au slot enregistrer pour les enregistrer dans le fichier temporaire ?
    Il faudrait pas mieux que je fasse la copie dans ce même slot telechargement_fichier() ?

    Merci !

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Voici déjà le PHP que j'utilise pour produire ce fichier XML :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <?php
     
    /*
    **    Récupère dans un tableau l'ensemble des fichiers
    **    du dossier updates, leurs hashes MD5, SHA1,
    **    et la date de dernière modification (en brut)
    */
     
    $dir = opendir('./'); 
    $i = 0;
    $list = array();
     
    while($file = readdir($dir))
    { 
        if ($file != 'index.php' && $file != '.' && $file != '..')
        {
            $list[$i] = array (
                            'filename'    => $file,
                            'md5'        =>  md5_file ($file),
                            'sha1'        => sha1_file ($file),
                            'raw_date'    => filemtime ($file)
                              ); 
            ++$i;
        }
    } 
     
    closedir($dir); 
     
    /*
    **    Redirige le tableau vers un XML, en convertissant la date
    */
     
    // Utilisation de l'extension XmlWriter, disponible dès PHP 5.1.2
     
    $result = new XmlWriter ();
    $result->openMemory();
     
    $result->startDocument ('1.0', 'utf-8');    /*    <?xml version="1.0" encoding="utf-8"?>  */
    $result->startElement ('files');            /*    <files>      */
     
    foreach ($list as $file)
    {
        $result->startElement ('file');         /*    <file>       */
    		$result->writeElement ('filename', $file['filename']);							/*    <filename />       */
    		$result->writeElement ('md5', $file['md5']);									/*    <md5 />            */
    		$result->writeElement ('sha1', $file['sha1']);									/*    <sha1 />           */
    		$result->writeElement (  'date',  date ('d/m/Y/H/i/s', $file['raw_date'])  );	/*    <date />           */
        $result->endElement();                  /*    </file>      */
    }
     
    $result->endElement();                      /*    </files>     */
    $result->endDocument();                     /*                 */
     
    /*
    **    Affichage du fichier XML brut
    */
     
    echo $result->outputMemory();
    ?>
    Vois si ça t'aide, je continue ma réponse dans quelques temps.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Oui j'avais vu dans ton tuto mais comme j'ai pas assez de compétence j'ai fais plus simple ^^

    Pour l'instant ça fonctionne j'arrive à télécharger le fichier xml, le traiter mais je bloque à ce niveau... Comment envoyer ma liste de fichier à télécharger dans le slot qui va faire en sorte de télécharger tout les fichiers et de les placer dans le dossier temporaire.

    Ce qui ne fonctionne pas actuellement c'est juste d'envoyer une liste des fichiers dans ce slot.

    Après si tu veux je peux toujours t'envoyer les sources de ce que j'ai déjà fait pour que tu vois un peu mais je pense qu'au final c'est la même chose sauf que le miens et beaucoup plus simplifié et moins optimisé, donc comme tu veux

    PS : comment tu sais avec ton code si ton fichier dois s'installer dans le dossier racine ou un sous dossier ?

    Merci

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Comment as-tu traité le fichier ? Qu'est-ce que tu as comme structure ?

    Avec cette solution, j'arrive à une liste de fichiers à télécharger avec MD5, SHA1 et timestamp, envoyée depuis la partie XML vers la partie réseau (à coups d'emit et de slots). Une fois dans la partie réseau, il suffit d'itérer la liste et, pour chaque item, tu vérifies si tu dois mettre à jour le fichier ou non. Si oui, tu lances un signal avec l'URL du fichier à télécharger et son emplacement. Un slot le récupère, lance le téléchargement et connecte le signal de fin de téléchargement au slot d'écriture du fichier.

    Tu aurais donc un QVector de fileToDownload (ou une autre structure définie par toi) que tu passes en paramètre lors de l'émission du signal :

    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
    QVector<fileToDownload> fichiers; 
    /* remplissage du vecteur */
    emit iHaveMyVector(vector);
     
    slot iHaveMyVector(QVector<fileToDownload> vector)
    {
    foreach(vector, item)
    {
    emit downloadThisYouSlave(item);
    }
    }
     
    slot downloadThisYouSlave(fileToDownload file)
    {
    QNetworkReply this->reply = manager->get(QNetworkRequest(QUrl(file.url()))); 
    connect(request, SIGNAL(finished), this, SLOT(writeThisYouSlave));
    }
     
    slot writeThisYouSlave()
    {
    this->reply est un QIODevice, fais-en ce que tu en veux. 
    }
    C'est du pseudo-code à base de C++, ça ne compilera pas, mais ça donne l'idée générale. Même avec une syntaxe correcte, ça ne fonctionnera pas, tu ne stockes qu'une réponse à la fois dans ton objet. Sans trop changer de choses, tu peux modifier le code pour ne lancer le téléchargement suivant que quand le fichier est écrit. Ou bien, lancer à chaque fois, un thread pour le téléchargement d'un ficheir. OU bien simploement un autre objet qui se charge de prendre l'URL à télécharger et qui le télécharge et le met lui-même.

    Pour savoir où le stocker, tu reprends l'URL, tu enlèves l'URI du mirroir et te voilà avec le nom de ton fichier. Pour faire du multirépertoire, utilise un caractère genre _ pour signifier un nouveau répertoire.

    Edit : ah, la belle heure !
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Ah oui ok moi je compare le md5 du fichier dans le fichier xml avec le md5 du fichier de l'utilisateur si différent je le télécharge sinon je fais rien.

    Mais c'est ça qui me bloque parce que si je fais une liste je vais devoir télécharger un par un,

    Donc il faut que je crée une liste au fur et à mesure une fois le traitement finit je lance le slot de téléchargement avec la liste en paramètre et ensuite dans le slot téléchargement je fais une boucle pour télécharger tout les fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    QNetworkRequest url_requete(QUrl("URL_DU_FICHIER_DANS_LA_LISTE"));
        QNetworkAccessManager *manager = new QNetworkAccessManager;
        QNetworkReply *reply = manager->get(url_requete);
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(messageErreur(QNetworkReply::NetworkError)));
        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(infos_telechargement_fichier(qint64, qint64)));
        connect(reply, SIGNAL(finished()), this, SLOT(enregistrer()));
    Donc il serait mieux de mettre la fonction pour réécrire le fichier télécharger directement avec le code de téléchargement dans la boucle qui permet de télécharger chaque fichier et de l'enregistrer non ?

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par austin.fla Voir le message
    Donc il faut que je crée une liste au fur et à mesure une fois le traitement finit je lance le slot de téléchargement avec la liste en paramètre et ensuite dans le slot téléchargement je fais une boucle pour télécharger tout les fichiers
    C'est une des solutions possibles, tu peux créer la tienne si tu veux.

    Citation Envoyé par austin.fla Voir le message
    Donc il serait mieux de mettre la fonction pour réécrire le fichier télécharger directement avec le code de téléchargement dans la boucle qui permet de télécharger chaque fichier et de l'enregistrer non ?
    Sauf que tu n'as pas directement le fichier téléchargé dès que tu en as demandé le téléchargement. De plus, ces fonctions sont asynchrones : tu fais la demande, rien n'est disponible mais la portion de code continue à s'exécuter. Il faut impérativement séparer cette partie, n'écrire le fichier que dans un slot exécuté uniquement quand le signal readyRead ou finished est arrivé. Sinon, tu écriras des bribes de fichier.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. Réponses: 9
    Dernier message: 27/10/2005, 22h38
  2. [Delphi 2005] Comment parcourir la liste des fichiers ?
    Par babyface dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2005, 11h01
  3. Réponses: 7
    Dernier message: 19/09/2004, 22h01
  4. liste des fichiers d'un répertoire
    Par am dans le forum C
    Réponses: 3
    Dernier message: 04/08/2003, 17h03
  5. [Kylix] Liste des fichiers d'un répertoire
    Par Houben Jacques dans le forum EDI
    Réponses: 3
    Dernier message: 30/11/2002, 21h14

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