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

Discussion :

[QFile] Taille pendant une copie/un déplacement

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    damien12345
    Invité(e)
    Par défaut [QFile] Taille pendant une copie/un déplacement
    Bonjour à tous,

    Mon petit soft consiste à faire un traitement sur des fichiers qui arrivent dans un dossier.

    Après avoir renseigné le dossier à mon programme, le thread se lance et regarde toutes les x secondes s'il n'y a pas un nouveau fichier.

    Jusque là tout se passait bien jusqu'à ce que je me rende compte que les fichiers lourds prenaient plus de temps pour se copier et que ça faisait planter mon programme qui commencait le traitement alors que le fichier n'avait pas encore fini de se copier.

    Comment faire pour éviter ce problème ?

    J'avais pensé bloquer le traitement, tant que le fichier n'a pas atteint sa taille complète, sauf que je n'arrive pas à récupérer la taille réelle (pendant la copie).
    QFile::size() renvoie la taille complète même si le fichier n'est pas copié entièrement.

    Merci d'avance pour votre aide, je suis sûr d'être passé à côté d'une information dans la doc de Qt (mon anglais n'étant pas satisfaisant).


    Informations supplémentaires:
    Récupération des fichiers avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Parcours du dossier
    QDirIterator dirIterator(*m_directoryPath, listFilter ,QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories);
     
            while(dirIterator.hasNext())
            {
                nextPicture = dirIterator.next();
                if(!m_fileList.contains(nextPicture))
                {
                    m_fileList << nextPicture;
                }
            }
    Dernière modification par damien12345 ; 27/09/2012 à 14h41.

  2. #2
    damien12345
    Invité(e)
    Par défaut
    J'ai finalement réussi à trouver une réponse moi même.

    Donc voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                QFile f("NomDuFichier");
     
                while(!f.open(QIODevice::ReadWrite))
                {       
                    sleep(1);
                }
                f.close();
    Et voilà, mon thread attendra que le fichier soit entièrement copié avant d'y toucher.

    Si vous avez d'autre solution n'hésitez pas
    Dernière modification par damien12345 ; 28/09/2012 à 11h29.

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Tu as utilisé QFileSystemWatcher ?

    Sinon potentiellement ton programme pourrait se bloquer dans la boucle si le fichier est réellement locké (déjà ouvert...). Mais je n'ai pas de meilleure idée.

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 323
    Par défaut et avec un verrou exclusif
    Autre hypothèse :

    Avec un verrou exclusif sur le fichier, à savoir que si le fichier est en cours de copie, un autre process ou thread y accède donc le verrou ne peut pas être posé.

    Dans la doc Qt j'ai trouvé dans les membres QFile hérités la fonction waitForReadyRead qui permet d'attendre pendant 1 certain délai l'arrivée de nouvelles données dans le flux, si j'ai bien compris l'utilité de la fonction. Par contre pas de traces de verrou ( pas d'openmode intégrant un verrou ).

    Par rapport à mon niveau, je ne peux pas affirmer que ce n'est pas implémenté mais je ne trouve pas.

    Par contre j'ai trouvé ça :
    http://doc.qt.digia.com/solutions/3/...e.html#details

    Je pense que c'est externe à Qt.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    damien12345
    Invité(e)
    Par défaut
    Merci, je regarderai tout ça quand je reprendrai le projet, je posterai ma solution pour tout le monde

  6. #6
    damien12345
    Invité(e)
    Par défaut
    Bonjour tout le monde,

    Je déterre un peu le sujet pour vous informer de ce que j'ai fait.

    Au final je suis resté avec à peu près la même version qu'au départ, car je n'ai pas le temps de chercher quelque chose de plus performant étant sur plusieurs projets en même temps

    Si vous avez rencontré le même besoin que moi, n'hésitez pas à poster votre solution, ça m'intéresse !

    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
     
    QFile fic("PathDeMonFichier");
    int tempsCopieMax = 10000; //en milliseconde
    qint64 tempsANePasDepasser = QDateTime::currentMSecsSinceEpoch() + tempsCopieMax;
    bool ouvertureReussi = false;
     
    QString messageErreur = "";
     
    if(fic.exists())
    {
        do
        {
            ouvertureReussi = fic.open(QIODevice::ReadOnly);
            msleep(1); // Je suis dans une classe héritant de QThread
         }while(!ouvertureReussi && tempsANepasDepasser > QDateTime::currentMSecsSinceEpoch());
     
        if(ouvertureReussi)
        {
            fic.close(); // Pour moi il n'est pas utile de le laisser ouvert ;)
     
            //Traitement sur fichier
            //...
        }
        else
        {
            messageErreur += "Erreur lors de l'ouverture du fichier, délai de transfert dépassé (temps d'attente fixé à " + QString::number(tempsCopieMax/1000.0) + " secondes).\n";
        }
    }
    Voilà, en espérant avoir aidé toutes les personnes ayant lu cette discussion.

    Bye !

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

Discussions similaires

  1. taille d'une image et leur déplacement
    Par ninitta dans le forum Général Java
    Réponses: 2
    Dernier message: 08/12/2010, 10h23
  2. Coupure Internet pendant une Copie Réseau
    Par Nalange dans le forum Windows 7
    Réponses: 0
    Dernier message: 26/02/2010, 01h33
  3. Réponses: 3
    Dernier message: 23/11/2006, 00h29
  4. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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