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

JavaFX Discussion :

Savoir si un fichier n'est plus utilisé


Sujet :

JavaFX

  1. #1
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut Savoir si un fichier n'est plus utilisé
    Bonjour tout le monde,

    Je rencontre un petit probleme via l'utilisation des fichiers .

    Je voudrai savoir si un fichier est encore utilisé par mon programme (quand le flux de donnée n'est pas encore fermer ...) pour pouvoir faire des modifications dessus (suppression ....).

    Je ne contrôle pas moi même le flux directement, car je passe par une classe déjà toute faite de javaFX (MediaPlayer) .

    Pour fermer le flux j'utilise la méthode "dispose" de MediaPlayer, mais elle met du temps à libérer la ressource (j'ai même lu sur certain forum qu'il y avait un bug de javaFX pour cette méthode http://stackoverflow.com/questions/1...dle-on-windows).

    J'ai trouvé sur un autre forum où un développeur utiliser la méthode "FileUtils.touch(file)" d'apache, qui renvoi un boolean (true = fichier libre ,false = l'inverse) mais ça ne fonctionne pas .

    Je suis donc preneur de toutes idées , propositions ... qui pourrait solutionner mon probleme .

    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    La classe File possede aussi la methode canWrite

    Je ne sais pas si ca fonctionnera mieux que FileUtils.touch mais ca vaut le coup d'essayer.

    Concernant le probleme, si les fichiers ne sont pas fermés, ca risque d'etre compliqué de les supprimer. Il existe des programmes qui le font (par exemple unlocker, donc c'est faisable. Par contre, je ne sais pas si c'est possible avec les API Java classiques (il y a peut etre besoin de jouer de JNI pour y arriver). De plus, ca peut causer des instabilités, voir plantages puisque ton programme risque de vouloir acceder à un fichier qui n'est plus accessible.

    Est ce qu'un simple deleteOnExit avec une gestion de l'existance du fichier avant creation ne suffirait pas ?

  3. #3
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Merci de t’intéresser à mon problème hwoarang ,
    Je me suis déjà penché sur la méthode « canWrite » de la classe File, mais si je ne dis pas de bêtise celle-ci indique juste si on a les droits d'écriture sur le fichier et non si celui-ci est utilisé donc malheureusement elle ne m'apporte aucune aide.
    Et j'ai pensé aussi à la méthode « deleteOnExit » mais comme mon but est de "déplacer" le fichier vers un autre répertoire j'utilise la méthode "FileUtils.moveFile" qui si on regarde a l'intérieure copie le fichier dans le répertoire de destination avant de supprimer l'ancien .C'est à cette suppression que m'on exception intervenir ...
    J'ai trouvé une solution en ce qui concerne le MediaPlayer de JavaFX. J'ai lu de nombreux post et j'ai compris que c'était le GC une fois la méthode « mediaPlayer.dispose() » appeler qui libérer le fichier en question . Ce qui est à mon avis très mal fait… J’ai donc appelé le GC manuellement est mon problème c’est résolue le fichier n’est plus utiliser par la suite.
    Mais je suis toujours preneur d’une solution alternative car ça peut arriver dans d’autre cas et je pense ne pas être le seul à me poser la question ^^.

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Badshade23 Voir le message
    Je me suis déjà penché sur la méthode « canWrite » de la classe File, mais si je ne dis pas de bêtise celle-ci indique juste si on a les droits d'écriture sur le fichier et non si celui-ci est utilisé donc malheureusement elle ne m'apporte aucune aide.
    Ah ok. D'après son nom, j'avais supposé qu'elle vérifiait que le fichier était libre. Mais je ne pense pas avoir deja eu ce cas donc il est effectivement possible qu'elle ne le fasse pas...

    Citation Envoyé par Badshade23 Voir le message
    J'ai trouvé une solution en ce qui concerne le MediaPlayer de JavaFX. J'ai lu de nombreux post et j'ai compris que c'était le GC une fois la méthode « mediaPlayer.dispose() » appeler qui libérer le fichier en question . Ce qui est à mon avis très mal fait… J’ai donc appelé le GC manuellement est mon problème c’est résolue le fichier n’est plus utiliser par la suite.
    Effectivement, c'est moche. Mais si c'est bien dispose qui relache le fichier, je ne vois pas non plus d'autre solution à part utiliser un autre framework.

    Sinon, comme autre solution moche il y a aussi copier les fichiers que tu peux etre amené à vouloir déplacer avant de les jouer. Comme ca, tu n'ouvres pas le fichier à déplacer et tu peux en faire ce que tu veux. Et pour les fichiers temporaires, tu peux utiliser deleteOnExit. Mais bon, si c'est des gros fichiers, c'est pas top.

  5. #5
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Sinon, comme autre solution moche il y a aussi copier les fichiers que tu peux etre amené à vouloir déplacer avant de les jouer. Comme ca, tu n'ouvres pas le fichier à déplacer et tu peux en faire ce que tu veux. Et pour les fichiers temporaires, tu peux utiliser deleteOnExit. Mais bon, si c'est des gros fichiers, c'est pas top.
    Je suis d'accord avec toi mais je veux le déplacer bien plus tard donc pour mon fonctionnement ça n'est pas possible ^^.
    Je trouve dommage qu’il n’existe pas de méthode de la class File ou même d'Apache qui permette de vérifier ça aux vues des recherches effectuer sur Google beaucoup de personnes se pose la question sans trouver de réponse vraiment correcte ...

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il n'y a pas de méthode pour le faire, car se poser la question "est-ce que j'ai toujours le fichier ouvert" n'a pas de sens.

    Si il est ouvert et que tu te pose la question, c'est que tu n'as pas la main sur les ressources te permettant de le fermer => il y a une erreur dans le programme (ou dans javaFX en l'occurence)
    Si il est fermé, ça ne veux pas dire qu'il n'est plus verrouillé ou que tu pourra le fermer.

    Si la question reviens souvent sur google, c'est parce que les développeur font souvent n'importe quoi avec les ressources et tentent de les retrouver après.


    Ensuite, si c'est pour de l'analyse, il existe des outils spécifiques aux OS pour analyser les handles. Sous linux tu peux utiliser lsof.

    Enfin, concernant mediaplayer, il devrait libérer immédiatement le fichier dès que tu appelle dispose dessus, vu ce bugfix de 2013:

    https://bugs.openjdk.java.net/browse/JDK-8118993

  7. #7
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Pour la gestion des fichiers je suis totalement d'accord je n'ai jamais rencontré ce problème avant d'utiliser le MediaPlayer.
    Et Oui j'ai déjà lu les messages de ce forum notamment le commentaire :
    You need to call dispose() method on MediaPlayer, if you do not want to wait for GC to release resources. This API is available since 2.2.40.
    Mais s'il est vraiment réparé sachant que je fais bien l'appel de la méthode "stop" puis "dispose()" je ne comprends pas pourquoi cela ne fonctionne pas . Et encore moi pourquoi au simple appel du GC derrière ceci fonctionne parfaitement .

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu as peut être une autre ressources qui utilise ce fichier? L'appel à GC n'est jamais une bonne idée. Tu n'as même pas de garantie que gc() fera quoi que ce soit.

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    On est pas à l'abri d'un bug ou d'une régression et si c'est le cas il ne faut pas hésiter à le reporter. Pour le reste, comme indiqué il faut passer par des outils natifs pour tenter de voir les handles en cours.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Je suis sur de ne pas avoir une autre ressource qui utilise ce fichier.
    Après comme mon application est en swing, je lance un thread via Platform Runlater pour le mediaplayer peut-être qu'il y a quelques millisecondes de décalage entre eux ....

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu peux montrer un code qui marche et un code qui foire, comprenant le gc, le dispose et la tentative de delete?

    Si tu travaille sur deux thread séparés, il est possible que le gc mette juste en attente ton thread le temps que ton autre thread fasse le dispose

  12. #12
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Bonjour, désoler du retard de ma réponse j’étais pas mal occupé en ce moment.
    Pour le code cela concerne beaucoup trop de classes cela serait incompréhensible de tous mettre ici ...
    En attendant je vais garder le système du GC même si ce n'est pas propre, je me repencherai sur la question plus tard.
    Je remercie tout le monde pour votre aider, opinion.
    Si quelqu'un retombe sur le même problème plus tard, n'hésiter pas à me contacter je vous aiderai avec plaisir si j'ai réussi à résoudre le problème "plus proprement".
    Bonne journée à tous, sujet résolu .

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

Discussions similaires

  1. Savoir quelle sont les requêtes les plus utilisées ?
    Par tchoumak dans le forum Requêtes
    Réponses: 1
    Dernier message: 29/06/2006, 16h45
  2. savoir si un fichier excel est ouvert
    Par toytoy18 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/06/2006, 10h12
  3. [Fichier Texte] Est-ce utilisable pour importation données ?
    Par avantoux dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 15/12/2005, 17h55
  4. Réponses: 5
    Dernier message: 05/11/2005, 11h43
  5. Comment savoir si un fichier/répertoire est en lecture seule
    Par Guigui_ dans le forum Général Python
    Réponses: 3
    Dernier message: 29/12/2004, 16h05

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