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

Entrée/Sortie Java Discussion :

Pb de suppression d'un fichier avec la méthode File.delete()


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Pb de suppression d'un fichier avec la méthode File.delete()
    Bonjour à tous,

    j'ai un soucis de suppression d'un fichier de properties.
    Les fichiers properties sont lus au démarrage de Jonas. Je crée un formulaire listant les fichier properties et permettant de supprimer ces fichiers !

    Quand je suis en mode débogage et que je passe dans chaque classe à partir de la méthode Delete (java.io.File puis java.lang.SecurityManager puis java.security.AccessController puis java.security.AccessControlContext) le fichier ce supprime bien !
    si j'enleve mon point d'arret le fichier ne se supprime pas !
    j'ai mis un try catch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
         deleteFile = fichierEnvironnement.delete();
         System.out.println(deleteFile);
    }catch (SecurityException e){
         System.out.println("erreur : " + e.toString());
    }
    je ne rentre jamais dans l'exception mais mon deleteFile est à false donc le fichier n'est pas supprimer !

    Avez vous déjà été confronté à ce genre de problème ?
    merci de votre aide.

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    File.delete() ne marche pas toujours car tu n'as pas les droits d'accès sur le fichier (genre il est ouvert dans une autre applic).
    File.deleteOnExit() ne marche pas toujours non plus.
    Voilà ma solution.

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    /**
     * Thread for deleting a file.
     * Try again as long as the file isn't deleted and max tries allowed hasn't be exceeded.
     * 
     * @author natha
     */
    public class DeleteFileThread extends Thread {
     
    	/** The Logger */
    	private static Logger logger = Logger.getLogger(DeleteFileThread.class);
     
    	/** The file to delete */
    	private File file;
     
    	/** The delay before trying to delete */
    	private int delay;
     
    	/** Maximum tries allowed */
    	private int maxTries;
     
    	/** The number of tries */
    	private int count;
     
    	/** Default value for delay */
    	private static int DEFAULT_BEGIN_DELAY = 10000;
     
    	/** Default maximum tries allowed */
    	private static int DEFAULT_MAXIMUM_TRIES_ALLOWED = 3600; // 3600 * 1000 secondes = 1h
     
    	/**
             * Default Constructor
             * 
             * @param file The file to be deleted
             * @param delay The delay before trying to delete
             * @param maxTries Maximum tries allowed (0 means default)
             */
    	protected DeleteFileThread(File file, int delay, int maxTries) {
    		super();
    		this.file = file;
    		this.delay = delay;
    		this.maxTries = (maxTries == 0 ? DEFAULT_MAXIMUM_TRIES_ALLOWED : maxTries);
    		this.count = 0;
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Thread#run()
    	 */
    	@Override
    	public void run() {
    		try {
    			sleep(delay);
    			while (count < maxTries && !file.delete() && file.exists()) {
    				count++;
    				sleep(1000); // sleep for 1sec (= try again in 1sec)
    				if (count == maxTries) {
    					logger.info("Max tries exceeded (" + maxTries + ") and the file '" + file.getCanonicalPath() + "' hasn't be deleted");
    				}
    			}
    		} catch (InterruptedException e) {
    			logger.fatal("Unexpected error", e);
    		} catch (IOException e) {
    			logger.fatal("Unexpected error", e);
    		}
    	}
     
    	/**
             * @param file The file to be deleted
             */
    	public static void createThread(File file) {
    		createThread(file, DEFAULT_BEGIN_DELAY, 0);
    	}
     
    	/**
             * @param file The file to be deleted
             * @param delay The delay before trying to delete
             */
    	public static void createThread(File file, int delay) {
    		createThread(file, delay, 0);
    	}
     
    	/**
             * @param file The file to be deleted
             * @param delay The delay before trying to delete
             * @param maxTries Maximum tries allowed (0 means default)
             */
    	public static void createThread(File file, int delay, int maxTries) {
    		DeleteFileThread dft = new DeleteFileThread(file, delay, maxTries);
    		dft.start();
    	}
     
    }
    Tu fais simplement : DeleteFileThread.createThread(monFichier) et ce thread va tenter de supprimer ce fichier pendant 1h toutes les 1s (paramétrable).
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    ok merci ! le problème est résolu,
    j'ai utiliser ta boucle while dans mon code !
    Merci bien


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int maxTries =10000;
    int count = 0;
    while (count < maxTries && !file.delete() && file.exists()) {
         count++; 
    }

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    J'serais toi, je rajouterais un Thread.sleep(100) au moins pour éviter de boucler trop rapidement. Si le fichier est bloqué, tu sortiras de la boucle trop vite et elle aura vite fait de te prendre 100% de temps proc.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  5. #5
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    'jour

    J'ajoute mon opinion sur la question :
    j'ai déjà eu aussi ces problèmes et je les ai résolus à 99% en séparant les méthodes manipulant les fichiers (une méthode pour écrire, une autre pour lire, une autre pour créer un fichier,...) en annulant toutes les variables ayant un rapport avec l'objet fichier crée (fileoutputstream etc...).Il me semble que si le fichier ne se supprime pas c'est qu'un des objets crées vérouille le fichier, mais si ton appli le permet le fichier finit toujours par être supprimé même après un certain délai... je n'en suis jamais arrivé à être obligé de créer une boucle de suppression qui me semble pas être l'optimum.

  6. #6
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Le thread que j'ai copier/coller peut répondre à tous les cas. Il y a des applics où les fichiers sont gérés également par des processus externes à ton programme java.

    Exemple :
    Tu crées un PDF pour impression, tu lances l'ouverture du PDF par adobe. Tu ne pourras pas supprimer le fichier PDF tant qu'il n'est pas libéré par adobe. Par contre l'utilisateur pourrait décider de quitter l'applic alors qu'adobe est encore ouvert. Résultat, même si tu attendais la fermeture d'adobe, tu ne pourras plus effacer le fichier.

    Le thread d'effacement répond à tous les cas et ne te monopolise pas les ressources étant donné qu'il dors à chaque nouvel intervale.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

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

Discussions similaires

  1. Suppression d'un fichier avec AWK
    Par turbo_chess dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 02/02/2010, 15h54
  2. gérer l'erreur lors de suppression d'un fichier avec la commande KILL
    Par samus535 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 22/12/2009, 09h57
  3. [jdic]Ouvrir un fichier avec la méthode Desktop
    Par Bloodscalp dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/10/2006, 11h29
  4. Plusieurs formulaires dans un fichier avec plusieurs méthodes post
    Par cyberdevelopment dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2006, 15h04
  5. Réponses: 8
    Dernier message: 14/11/2003, 22h51

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