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

Langage Java Discussion :

Juste supprimer un fichier texte


Sujet :

Langage Java

  1. #1
    Membre du Club Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 54
    Points
    54
    Par défaut Juste supprimer un fichier texte
    Bonjour à tous,

    J'ai vraiment du mal sur ce coup là.

    En gros je veux modifier un fichier texte.
    Donc je l'ouvre et je le lit ligne par ligne.

    Chaque ligne lue est modifiée, et écrite dans un nouveau fichier texte.

    Je me retrouve donc avec mon fichier d'origine qui a juste été lu, et avec un nouveau fichier dont le contenu est différent du premier.

    A ce niveau là, le but est de supprimer le fichier d'origine puis de renommer le nouveau avec le nom du premier.

    Et c'est la suppression qui bloque. J'ai l'impression que lorsque j'ouvre le fichier d'origine pour le lire, Windows crée un processus qui ne se fermera pas ensuite, m’empêchant ainsi de le supprimer.

    J'imagine que je dois mal fermé mes bufferedReaders ou autres...

    Et ça n'est pas systématique! Parfois il suffit d'attendre assez longtemps pour que la suppression se fasse, mais ça ralenti mon appli méchamment.

    Voici mon code bien simplifié:

    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
     
    private void ecrireInformations(String fichier) throws IOException
    {
     
    	FileWriter writer = null;
    	BufferedWriter output = null;
    	BufferedReader reader = null;
    	try
    	{
     
    		File fic = new File(fichier);
    		FileInputStream fis = new FileInputStream(fichier);
    		InputStreamReader isr = new InputStreamReader(fis);
    		reader = new BufferedReader(isr);
    		writer = new FileWriter("." + File.separator + name, true);
    		output = new BufferedWriter(writer);
     
    		while (reader.ready())
    		{
    			String line = reader.readLine();
     
    			output.newLine();
    			output.write(line + " exemple");
     
    		}
     
    		fis.close();
    		isr.close();
    		reader.close();
    		output.flush();
    		output.close();
    		writer.close();
     
                    //C'est là que ça mouline tant que le fichier n'est pas débloqué.
    		while (fic.exists())
    		{
    			secureDelete(fic);
    		}
     
     
    		File source = new File("." + File.separator + name);
    		source.renameTo(fic);
     
    	}
    	catch (FileNotFoundException e)
    	{
    		e.printStackTrace();
    	}
    }
     
    public static void secureDelete(File file) throws IOException
    {
    	if (file.exists())
    	{
    		long length = file.length();
    		SecureRandom random = new SecureRandom();
    		RandomAccessFile raf = new RandomAccessFile(file, "rws");
    		raf.seek(0);
    		raf.getFilePointer();
    		byte[] data = new byte[64];
    		int pos = 0;
    		while (pos < length)
    		{
    			random.nextBytes(data);
    			raf.write(data);
    			pos += data.length;
    		}
    		raf.close();
    		file.delete();
    	}
    }
    Où ai-je foiré?

    Merci d'avance!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Pourquoi écris-tu des données dans le fichier à supprimer ?

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 086
    Points : 8 004
    Points
    8 004
    Par défaut
    Parce que tu n'as pas bien lu Il ecrit dans une nouveau fichier qui va remplacer l'ancien.

    Citation Envoyé par docv266 Voir le message
    Chaque ligne lue est modifiée, et écrite dans un nouveau fichier texte.

    Je me retrouve donc avec mon fichier d'origine qui a juste été lu, et avec un nouveau fichier dont le contenu est différent du premier.

    A ce niveau là, le but est de supprimer le fichier d'origine puis de renommer le nouveau avec le nom du premier.

  4. #4
    Membre du Club Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 54
    Points
    54
    Par défaut
    C'est ça.

    Il n'y a pas moyen de modifier directement un fichier texte n'est-ce pas? Il faut absolument en écrire un nouveau?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Parce que tu n'as pas bien lu Il ecrit dans une nouveau fichier qui va remplacer l'ancien.
    Si j'ai bien lu, je parlais de la méthode secureDelete(...) et des 64 bytes aléatoires écris dans ce fichier...

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 631
    Points
    21 631
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Parce que tu n'as pas bien lu Il ecrit dans une nouveau fichier qui va remplacer l'ancien.
    Lis son code.

    Citation Envoyé par wax78 Voir le message
    C'est ça.
    Non ce n'est pas ça. Ta méthode "secureDelete()" (?? What the heck, au passage ??) écrit des données aléatoires dans le fichier que tu cherches à supprimer. Pourquoi ?

    Note : je ne dis pas que le problème vient de là. Je ne vois pas l'intérêt, mais en principe ça ne devrait pas gêner la suppression du fichier.

    Citation Envoyé par wax78 Voir le message
    Il n'y a pas moyen de modifier directement un fichier texte n'est-ce pas? Il faut absolument en écrire un nouveau?
    Bah disons que si le fichier n'est pas trop gros, il est possible de travailler avec une copie en mémoire au lieu de sur disque. Mais ça revient au même, oui.

  7. #7
    Membre du Club Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 54
    Points
    54
    Par défaut
    Ma fonction secureDelete (qui n'est pas de moi d'ailleurs) peut surprendre oui.

    En fait au fil de mes recherches pour arriver à supprimer ce fichier, j'ai testé plusieurs solutions.
    Cette fonction est celle qui marchait le mieux au moment de mes tests mais je vais la remplacer par un bon vieux File.delete qui sera amplement suffisant une fois l'erreur trouvée.

    Je rappelle que je ne peux pas supprimer le fichier d'origine (celui qui est juste lu) , il me faut attendre que le fichier soit libéré.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Au passage

    Ne me parait pas correct pour lire ton fichier ligne par ligne.
    ready() ne retourne pas une information de "reste à lire", mais de "prêt à lire".


    ==> http://java.developpez.com/faq/java/...eLigneParLigne

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    +1 avec Mathieu.J : il vaut mieux éviter de se baser sur la méthode ready() de Reader (tout comme available() d'InputStream d'ailleurs). Ces méthodes peuvent renvoyer un résultat négatif avant la fin du fichier... il est préférable de simplement lire jusqu'à la fin du flux...


    En plus c'est encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        String line;
        while ( (line = reader.readLine()) != null ) {
            ...
        }




    Citation Envoyé par docv266 Voir le message
    Voici mon code bien simplifié
    Et tu rencontres le problèmes même avec ce code "simplifié" ?
    Tu es sûr que le fichier n'est pas utilisé par un autre processus ?

    Sinon quelques conseil :
    • évites de multiplier les flux et englobe-les (ca évitera de manipuler 5 variables pour un même flux :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      BufferedWriter writer = new BufferedWriter(new FileWriter("." + File.separator + name, true));
    • essayes de rester cohérent dans tes choix : dans un cas tu ouvres le fichier un InputStreamReader , dans l'autre tu utilises directement un FileWriter ? Pourquoi ne pas utiliser un FileReader ? ou un OutputStreamWriter ? Au passage attention à l'encodage que tu ne spécifie pas !

    • Utilises des try/finally pour libérer tes flux au plus tôt !



    a++

  10. #10
    Membre du Club Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 54
    Points
    54
    Par défaut
    Merci pour tous ces conseils, je vais appliquer ça ce soir.

    Je dois avouer que je me mélange un peu les pinceaux avec les flux.
    Il y a 3 couches de flux et plusieurs options possibles.

    Il faut absolument que je m'y intéresse vraiment et que j’arrête de recopier bêtement des lignes de codes trouvées sur Google...

    Je vous tiens au courant des mes tests de ce soir.
    Merci!

  11. #11
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 086
    Points : 8 004
    Points
    8 004
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Non ce n'est pas ça. Ta méthode "secureDelete()" (?? What the heck, au passage ??) écrit des données aléatoires dans le fichier que tu cherches à supprimer. Pourquoi ?
    Wipping ou shred file ?

  12. #12
    Membre du Club Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 54
    Points
    54
    Par défaut
    On est un peu HS là mais effectivement c'est le but de la fonction secureDelete.
    Ça fait du wipping. En gros on ne se contente pas de supprimer, on écrit par dessus pour être sûr que ça ne sera pas récupéré.

    Dans mon cas ce n'est absolument pas nécessaire.

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 631
    Points
    21 631
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Wipping ou shred file ?
    Ouais, j'y ai repensé. Je ne l'ai pas vu tout de suite, car je ne fais pas du tout une telle confiance aux systèmes de fichier, ni d'ailleurs à la manière dont les OS les appellent, ni à la manière dont Java appelle l'OS.

  14. #14
    Membre du Club Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 54
    Points
    54
    Par défaut
    Bon avec l'aide d'un pote et la votre j'ai nettoyé mon code et ça fonctionne.

    Le truc qui m'a sauvé je pense, c'est de lire le fichier source et de stocker les lignes dans un tableau. Ensuite je le ferme.

    Et c'est seulement après que j'écris le nouveau fichier (à partir du tableau donc) qui va venir écraser le fichier source car je lui donne le même nom.

    Voilou.

    Merci à tous.

  15. #15
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 086
    Points : 8 004
    Points
    8 004
    Par défaut
    C'est une solution ... mais qui n'en est pas une.

    Tu n'as pas réellement résolu ton problème, juste contourné.

    Imagine maintenant que je te donne des fichiers de 10 Gigas a traiter, tu vas mettre ca dans des tableau ? :p (not enough memory)

    Le fichier d'origine il n'est pas crée pas un autre process qui ne l'aurait pas bien fermé ? Il vient d'où ce fichier ? Il est la depuis combien de temps etc

  16. #16
    Membre du Club Avatar de docv266
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par wax78 Voir le message
    C'est une solution ... mais qui n'en est pas une.

    Tu n'as pas réellement résolu ton problème, juste contourné.

    Imagine maintenant que je te donne des fichiers de 10 Gigas a traiter, tu vas mettre ca dans des tableau ? :p (not enough memory)

    Le fichier d'origine il n'est pas crée pas un autre process qui ne l'aurait pas bien fermé ? Il vient d'où ce fichier ? Il est la depuis combien de temps etc
    Oui tu as raison le problème est contourné.
    Effectivement mes fichiers font une centaine de ligne grand max donc ça passe en utilisant un tableau.

    Les fichiers lus sont mes données d'entrée, ils ne sont pas créés par mon application.

    Je ne peux pas dire pourquoi ma première solution posait des problèmes de suppression, c'est d'ailleurs pourquoi j'ai demandé de l'aide sur le forum.

  17. #17
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par docv266 Voir le message
    Je ne peux pas dire pourquoi ma première solution posait des problèmes de suppression, c'est d'ailleurs pourquoi j'ai demandé de l'aide sur le forum.
    Le problème c'est que tu as donné un code "bien simplifié", donc il est fort possible que l'origine du problème ait été perdu lors de cette simplification. Sans le code exact tu n'auras pas de solution exacte...


    Sous Windows, l'appel de delete() échoue s'il reste des flux ouverts sur le fichier.


    a++

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

Discussions similaires

  1. Supprimer un fichier texte
    Par M0llusk59 dans le forum Windows Mobile
    Réponses: 0
    Dernier message: 11/07/2013, 16h04
  2. Réponses: 0
    Dernier message: 16/02/2009, 12h02
  3. Supprimer un fichier texte via VBA
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/04/2008, 23h01
  4. supprimer contenu fichier.text
    Par Alex35 dans le forum ASP
    Réponses: 3
    Dernier message: 20/03/2007, 14h29
  5. Supprimer une ligne dans un fichier text
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 14/03/2006, 17h43

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