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 :

Savoir si un fichier est ouvert dans une autre appli


Sujet :

Qt

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut Savoir si un fichier est ouvert dans une autre appli
    Bonjour,
    Dans mon application l'utilisateur édite un fichier (texte), et je laisse la possibilité de faire cette édition avec un autre logiciel. Pour ça, j'ouvre le fichier avec QDesktopServices::openUrl. Je surveille également ses modifications avec QFileSystemWatcher pour le recharger dans mon appli quand il est modifié en externe. Ce que j'aimerais pouvoir faire c'est savoir si le fichier est ouvert dans un autre programme (ou dans l'idéal être averti dés qu'il ne l'est plus, mais je suppose que ce n'est pas possible). En fait l'utilisateur bascule entre édition interne et externe avec un bouton, donc je voudrais pouvoir vérifier (lorsqu'il souhaite désactiver l'édition externe) s'il le fichier est encore ouvert dans un programme ou non.

    J'ai trouvé ça sur le net : http://qt.nokia.com/products/appdev/...s/qtlockedfile
    Mais ça n'a pas l'air de permettre une interaction avec des logiciels externes à l'appli. De plus ça ne semble pas natif, donc peut être moins portable ?

    Si quelqu'un a une idée ou la certitude que c'est impossible, merci d'avance :)

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Je pense qu'avec la classe QFile tu devrais pouvoir t'en sortir. Tu essaie d'ouvrir ton fichier (open() ) et si tu as un problème c'est surement qu'un autre programme l'utilise. De plus tu peux vraiment savoir d'ou vient le problème avec la fonction error().

  3. #3
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Non car je n'ai aucune erreur en ouvrant un fichier déjà ouvert par une autre application.

  4. #4
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 665
    Points : 188 673
    Points
    188 673
    Par défaut
    Tu peux essayer, si tu as le contrôle sur l'autre application, la communication interprocessus avec DBus, même si c'est sortir la grosse artillerie pour pas grand chose.

  5. #5
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Justement non, je lance une appli totalement externe, un programme quelconque de l'utilisateur. En l'occurence un éditeur de texte. Je me demandais s'il y avait un moyen que l'OS indique qu'un fichier est utilisé, mais bon je suppose que non.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par YoniBlond Voir le message
    Je me demandais s'il y avait un moyen que l'OS indique qu'un fichier est utilisé, mais bon je suppose que non.
    Normalement oui, l'os sait ce qui est ouvert. Mais ce sera du natif. Je te conseil de demande sur le forum C++ et de faire un tour sur la msdn (si tu est sous windows).

  7. #7
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Je suis justement en multi-plateforme. Donc je préfèrerais ne pas sortir des lib Qt. Merci pour vos réponses ! Ca n'était pas vital non plus, je vais faire sans, tant pis.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Peut être avec QFileInfo::lastRead() ?

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    QFileInfo::lastRead() retourne simplement la date du dernier accès au fichier.

    En fait, je ne suis pas sur que ce soit possible ce que tu veux faire...
    En général, une application ouvre le fichier (qui est alors lock par l'OS), importe les données (ou les enregistre) puis referme le fichier (et le fichier et unlock). Sauf cas particulier d'une application qui bloquerait l'accès à un fichier pour une raison particulière.
    Et d'un autre côté, est-ce que c'est utile ? Tu as juste besoin de savoir si un fichier que tu as ouvert est enregistré avec des modifications.
    Utilise simplement QFileInfo::lastModified() pour savoir si le fichier à été modifié depuis que tu l'as ouvert, ou mieux, QFileSystemWatcher (http://qt.developpez.com/doc/latest/...emwatcher.html) qui te préviendra dès qu'un fichier est modifié.

  10. #10
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    En fait j'utilise déjà QFileSystemWatcher, la lecture et mise à jour de mon appli fonctionne très bien.

    Pour faire simple : l'utilisateur active ou désactive un mode "saisie externe". Lors de l'activation je bloque la saisie dans mon appli, sauve le fichier, puis l'ouvre avec un autre programme. J'aurais voulu pour simple confort, que l'utilisateur ne puisse pas désactiver ce mode tant que le fichier est ouvert dans l'autre programme. Pour éviter que le fichier soit modifié par plusieurs programmes en même temps. Voire dans l'idéal que mon appli désactive automatiquement le mode lorsque l'utilisateur ferme l'autre programme d'édition.

    Mais j'ai l'impression que c'est impossible avec seulement Qt. J'avais aussi songé à ne pas lancer le programme avec QDesktopServices::openUrl mais plutôt avec QProcess, pour avoir totalement la main dessus (et donc savoir lorsqu'il se termine). Mais ça implique de connaitre le chemin exact du programme, alors qu'actuellement Qt se charge de lancer l'appli par défaut.

  11. #11
    Responsable Qt & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 665
    Points : 188 673
    Points
    188 673
    Par défaut
    Citation Envoyé par YoniBlond Voir le message
    Mais j'ai l'impression que c'est impossible avec seulement Qt. J'avais aussi songé à ne pas lancer le programme avec QDesktopServices::openUrl mais plutôt avec QProcess, pour avoir totalement la main dessus (et donc savoir lorsqu'il se termine). Mais ça implique de connaitre le chemin exact du programme, alors qu'actuellement Qt se charge de lancer l'appli par défaut.
    Tu peux aussi continuer sur cette solution de QProcess, en lançant une recherche sur l'exécutable voulu sur le disque dur, dans %PROGRAMFILES% ou %PROGRAMFILES(X86)% uniquement. Ou bien, tu proposes à l'utilisateur de sélectionner l'appli, et tu as direct le chemin.

    Si Qt arrive à connaître l'appli qui doit être chargée, tu dois pouvoir le connaître aussi. Il n'y aurait pas une méthode comme ça ? Ou bien une petite aide dans la source ?

  12. #12
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Je viens de regarder les sources de QDesktopServices. Les classes utilisées dedans ne sont pas accessible. Il faut donc les réécrire.

    Ca utilise une approche plateforme spécifique basée sur les types mime (recherche google avec "mime application par défaut")

    Sur win, ça utilise la base de registre (tu peux utiliser QSetting pour y acceder : http://qt.developpez.com/faq/?page=q...gistre-windows)
    le code de QDestokService : http://qt.gitorious.org/qt/qt/blobs/...rvices_win.cpp
    une explication du comment : http://www.devparadise.com/technoweb/sys/win/a242.php

    Sous linux, ça utilise un fichier de configuration (peut être également lisible avec QSetting ?)
    le code de QDS : http://qt.gitorious.org/qt/qt/blobs/...rvices_x11.cpp
    une explication : [gnome] HOW to set default application for a file type - Ubuntu Forums

  13. #13
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Merci de vos réponses ! C'est quand même assez compliqué à mettre en oeuvre on dirait. Je me pencherai peut être dessus lorsque j'aurai terminé les fonctionnalités plus urgentes.

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

Discussions similaires

  1. [WD14] Vérifier si un fichier est ouvert dans une autre application
    Par Gaautman dans le forum WinDev
    Réponses: 1
    Dernier message: 17/01/2010, 20h07
  2. Tester si le fichier est utilisé par une autre appli
    Par sivaller dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 05/06/2008, 19h47
  3. savoir si un fichier est ouvert
    Par niclalex dans le forum Access
    Réponses: 2
    Dernier message: 12/10/2005, 19h19
  4. [Liste] Savoir si un élément est présent dans une liste
    Par Wookai dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 02/05/2005, 20h44
  5. Unix - Comment savoir si un fichier est ouvert
    Par freddyboy dans le forum C
    Réponses: 7
    Dernier message: 06/10/2004, 15h53

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