[Java] Suppression de fichiers

Fermé
BareK - 19 juin 2009 à 10:05
 biboo - 19 juin 2009 à 11:54
Bonjour,

Je développe actuellement une application web en JEE sur Tomcat6 qui extrait les informations d'un fichier Excel pour les mettre dans un fichier XML (pour cela j'utilise les API POI et JDOM).

Une fois le traitement terminé, je supprime le répertoire temporaire que j'utilise pour traiter les fichiers (j'utilise le package java.util.io.*).

Pour tester j'ai créé deux fichiers Excel test.xls et test2.xls.
Etrangement, pour le fichier test.xls, tout se passe comme prévu, aucun problème à signaler.
Mais pour le fichier test2.xls, le programme me lance une exception disant qu'il ne peut pas supprimer le fichier test2.xml produit par mon application.
D'ailleurs moi non plus, je ne peux pas le supprimer sans arrêter le serveur Tomcat (fichier sois disant utilisé par un autre programme).

Le traitement des deux fichiers étant exactement le même, pourquoi dans un cas tout fonctionne parfaitement, et dans l'autre je ne peux pas supprimer les fichiers xml que j'ai produit?

Connaitriez-vous un moyen d'y remédier, ou bien de contourner le problème? (par exemple forcer la suppression)

Merci d'avance à tous ceux qui répondront :)
A voir également:

4 réponses

As-tu fermé ton fichier excel en lecture/écriture? (avec la méthode close())
2
kuchi007 Messages postés 308 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 3 août 2009 31
19 juin 2009 à 10:08
Tu as essayé avec trois fichiers??

Mais on dirait bien que c'est lié au fait que tant que ton serveur ne se ferme pas il considère que ton fichier .xls est toujours utilisé dans les ressources du serveur.

Je ne sais pas si tu traites tes fichiers dans une boucle qui itère sur chaque fichier, si c'est le cas peut être bien que le dernier traité n'est pas fermé.
0
Merci biboo et kuchi007 pour la rapidité de vos réponses.

Alors tout d'abord sachez que tous les fichiers présents dans le répertoire temporaire sont supprimés avec succés (fichier Excel compris).
C'est uniquement le fichier XML créé par JDOM qui refuse de se supprimer dans le cas ou je traite test2.xls.

kuchi007, oui j'itère dans une boucle qui liste tous les fichiers présents dans mon répertoire temporaire :

public class DelRep
{
private File del = null; // pointe sur le répertoire temporaire de l'application (temp)
//private File[] children = null; // liste des fichiers dans temp

public DelRep (String path)
{
this.del = new File(path); // pointe sur le répertoire temporaire de l'application (temp)
}

public void deleteTempDir () throws IOException
{
recursifDelete(this.del); // suppression du répertoire temporaire
}

public void recursifDelete(File del) throws IOException
{
if (!del.exists()) throw new IOException // si le path ne pointe vers rien
("File not found '" + del.getAbsolutePath() + "'");
if (del.isDirectory()) // si le path pointe vers un répertoire
{
File[] children = del.listFiles(); // on liste les fichiers contenus dans le répertoire

for (int i=0; children != null && i<children.length; i++)
recursifDelete(children[i]);

if (!del.delete()) throw new IOException
("No delete path '" + del.getAbsolutePath() + "'");
}
else if (!del.delete()) throw new IOException
("No delete file '" + del.getAbsolutePath() + "'");
}
}


Parcontre j'aurais du faire plus de test unitaires avant de poster :s

Je me suis rendu compte que pour le fichier test2.xls la suppression foire à chaque fois, mais pour le fichier test.xls ça ne marche que la première fois.
Si je relance le programme (un lien qui me renvoi sur la premiere servlet) et que je re-traite le fichier test.xls, j'obtient la même erreur qu'avec test2.xls (cad que le programme ne peut pas supprimer le fichier test.xml produit par mon application)

Cela doit forcément venir de mon programme un peu confus (car je suis débutant en programmation), mais la je sèche :s
0
Autre petite précision,

Je ne parcours pas mes fichiers xml que je produits, donc ils le devraient pas être ouvert en lecture.
Le seul flux que j'utilise sur eux, c'est le flux de sortie, et je le ferme bien :

public void enregistre(String fichier) // enregistre le nouveau fichier XML document
{
try
{
FileOutputStream fout = new FileOutputStream(fichier);
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
sortie.output(document, fout);
fout.close();
}
catch (java.io.IOException e){}
}

note : document est un objet de la classe JDOM :

private Element racine = new Element("Questions"); // création de l'élément racine
private org.jdom.Document document = new Document(racine); // création d'un nouvel objet JDOM
0
BareK > BareK
19 juin 2009 à 11:45
C'est bon, j'ai finit par trouver une solution :D

Je pensais que le problème devait venir de l'objet XMLOutputter qui utilise un flux de sortie.
J'ai donc finit par faire appel au Garbage Collector avant de supprimer le répertoire, ainsi plus d'objets donc plus de flux lié aux objets.

Apparament ça fonctionne très bien, même en relançant l'application sans redémarrer tomcat.
Moi ça me va :)

Problème résolu!

Merci biboo et kuchi007 pour vos réponses :)
0
kuchi007 Messages postés 308 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 3 août 2009 31
19 juin 2009 à 11:47
Effectivement les objets sont maintenus en mémoire si tu ne les déférences pas.
0
Pas de soucis! :)
0