|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre à l'essai
![]() Inscription : août 2007 Messages : 77 ![]() |
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 :
Merci d'avance! |
||
|
|
00
|
|
|
#2 |
![]() ![]() Mathieu Ingénieur développement logiciels Inscription : avril 2004 Messages : 855 ![]() |
Pourquoi écris-tu des données dans le fichier à supprimer ?
|
|
|
00
|
|
|
#3 | |
|
Membre Expert
![]() |
Parce que tu n'as pas bien lu
Citation:
|
|
|
|
00
|
|
|
#4 |
|
Membre à l'essai
![]() Inscription : août 2007 Messages : 77 ![]() |
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? |
|
|
00
|
|
|
#5 |
![]() ![]() Mathieu Ingénieur développement logiciels Inscription : avril 2004 Messages : 855 ![]() |
|
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 101 ![]() |
Citation:
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. 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. |
|
|
|
10
|
|
|
#7 |
|
Membre à l'essai
![]() Inscription : août 2007 Messages : 77 ![]() |
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é. |
|
|
00
|
|
|
#8 |
![]() ![]() Mathieu Ingénieur développement logiciels Inscription : avril 2004 Messages : 855 ![]() |
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 |
|
|
00
|
|
|
#9 | ||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
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 :
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 :
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||
|
00
|
|
|
#10 |
|
Membre à l'essai
![]() Inscription : août 2007 Messages : 77 ![]() |
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! |
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() |
|
|
|
10
|
|
|
#12 |
|
Membre à l'essai
![]() Inscription : août 2007 Messages : 77 ![]() |
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. |
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 101 ![]() |
|
|
|
00
|
|
|
#14 |
|
Membre à l'essai
![]() Inscription : août 2007 Messages : 77 ![]() |
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. |
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() |
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 |
|
|
10
|
|
|
#16 | |
|
Membre à l'essai
![]() Inscription : août 2007 Messages : 77 ![]() |
Citation:
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. |
|
|
|
00
|
|
|
#17 | |
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Sous Windows, l'appel de delete() échoue s'il reste des flux ouverts sur le fichier. a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|
|
10
|
Copyright © 2000-2012 - www.developpez.com