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 :

Erreur : "QIODevice device not open"


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut Erreur : "QIODevice device not open"
    Bonjour,

    Je rencontre sans doute un problème simple mais j'arrive pas à comprendre.
    J'ai le code ci-dessous qui me permet d'aller chercher des infos de films sur internet (en l’occurrence une image), et je souhaiterais l'enregistrer sur le disque.
    J'utilise un QNetworkAccessManager qui va chercher l'info sur internet. Une fois cela fait, j'inscris ces données dans un QFile.

    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
    void TheMovieDB::getPoster(const QString &pictureName, const QString &pictureUrl)
    {
        t_manager->disconnect(t_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(saveBackdrop(QNetworkReply *)));
        t_picturePath= "file:///"+QDir::currentPath()+"/poster/" + pictureName + ".jpg";
        t_infosList["poster"]=t_picturePath;
        QString url="http://image.tmdb.org/t/p/w1920"+pictureUrl;
        QObject::connect(t_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(savePoster(QNetworkReply *)));
        t_manager->get(QNetworkRequest(QUrl(url)));
    }
     
    void TheMovieDB::savePoster(QNetworkReply *reply)
    {
        qDebug()<<reply->readAll();
        QFile* file = new QFile;
        file->setFileName(t_picturePath);
        file->open(QIODevice::WriteOnly);
        file->write(reply->readAll());
        file->close();
        t_manager->disconnect(t_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(savePoster(QNetworkReply *)));
        emit dataRetrieved();
    }
    t_picturePath contient alors "file:///H:/Filmotheque Qt/MyMediaLibraries/Compilation/poster/Titanic.jpg". Le dossier poster existe donc normalement ça devrait marcher mais j'ai systématiquement ce message: "QIODevice::write: device not open", provenant de la ligne " file->write(reply->readAll());".
    Lorsque j'imprime reply->readAll() dans qDebug pour voir ce qu'il contient, j'ai ça:
    "????QIODevice::write: device not open" avec tous les points d'interrogation.

    Merci de votre aide.

    Cordialement

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Salut. Attention avec readAll()
    QNetworkReply is a sequential-access QIODevice, which means that once data is read from the object, it no longer kept by the device. It is therefore the application's responsibility to keep this data if it needs to.
    Je te suggère de connecter quelque chose au signal error() :
    This signal is emitted when the reply detects an error in processing. The finished() signal will probably follow, indicating that the connection is over.
    Tu apprendras sûrement des choses.
    -- Yankel Scialom

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Vu l’erreur je dirais plutôt que c’est file->open qui échoue. Donc déjà, tester sa valeur de retour (il doit renvoyer « true »).

    Ensuite, tu peux appeler la méthode « error() » sur ton objet QFile pour récupérer des informations supplémentaires sur le pourquoi de l’échec.

    Sinon c’est une histoire de style, mais plutôt que setFileName, utilises plutôt directement file->open(filename, filemode);

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    Effectivement, c'est bien file->open qui échoue. J'obtiens le code d'erreur 5 qui dit que le fichier ne peut pas être ouvert.
    Par contre j'ai aucune idée du pourquoi. J'aurais pensé que le chemin était mauvais mais j'ai déjà vérifié plusieurs fois. Je suis à cours d'idées...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    ok mais je suis censé faire quoi maintenant? J'ai réglé toutes les autorisations du dossiers pour avoir tous les pouvoirs et ça marche toujours pas. Je sais pas quoi faire de plus.

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Essaie de voir ce que ça dit sous filemon (apparemment c’est diskmon maintenant : https://technet.microsoft.com/en-us/...rnals/bb896646) ou procmon (https://technet.microsoft.com/en-us/...rnals/bb896645). Règle le filtre sur ton nom de processus, et tu auras le résultat de l’appel système. Ça devrait te donner des infos plus précises.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    Je pense avoir un "file locked with only readers". Mais franchement j'en sais rien, j'arrive pas à voir le moment où il est censé écrire sur le disque.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Si vous avez des processus lecteurs sur ce fichier, c'est normale qu'un "​->open(QIODevice::WriteOnly)" coince.
    En filtrant sur le nom du fichier, et les erreurs, je pense que la dernière ligne dans Filemon devrait avoir la clé du mystère.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    Eh bien à vrai dire je lis les films présents sur le disque. Donc j'accède effectivement au disque en écriture. Puis je récupère les infos sur internet et j'enregistre les images sur ce même disque (dons mon cas c'est un hasard). Mais ce bout de code avais marché il y a une semaine, puis ça n'a plus marché sans que je touche rien. Normalement la lecture et l'écriture ne se font pas en même temps.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    ça y est j'ai le fin mot de l'histoire (problème pourris, comme d'hab). En fait cette manipulation de fichier, je la faisais 2 fois dans mon code. Celle que je regardais marchait parfaitement mais j'ai cru qu'elle marchait pas. Alors que c'était l'autre qui affichait les messages car le chemin était pas bon. En effet, je rajoutais "file///" devant son nom pour que la partie en QML comprenne le chemin du fichier. Bon maintenant c'est un autre problème mais celui-là est réglé.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/04/2015, 09h13
  2. Réponses: 1
    Dernier message: 08/02/2013, 08h50
  3. [CVS] Problème de commit (Could not open lock file)
    Par 1tox dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 19/10/2004, 11h22

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