2010-01-26 4 views
0

Je sers un fichier du système de fichiers dynamically with a jspImpossible de supprimer un fichier après l'avoir lu

Voici mon code:

<%@ page import="java.io.*,java.util.*" 
    InputStream in = null; 
    OutputStream responseOut = null; 
    File file = new File(request.getAttribute("fileToServe")); 
    try{ 
     in = new FileInputStream(file); 
     responseOut = response.getOutputStream(); 
     // Transfer bytes from in to out 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) { 
      responseOut.write(buf, 0, len); 
     } 
    }finally{ 
     if(responseOut != null) try { 
      responseOut.close(); 
     } catch(IOException ioe){} 

     if(in != null) try { 
      in.close(); 
     } catch(IOException ioe){} 
    } 
    file.delete(); 
%> 

Le problème que je suis confronté est, le fichier est supprimer uniquement la première fois que le code est exécuté, ce qui est après le redémarrage du serveur. Les appels suivants ne supprime pas le fichier.

J'ai utilisé ProcessExplorer pour suivre cela et, et yeap, la machine virtuelle Java détient ce fichier, je ne sais pas vraiment pourquoi cela se produit.

Nous fonctionnerons sur Windows OS, toujours, y at-il un travail pour cela?

J'ai trouvé un certain nombre de ressources sur Internet à ce sujet, mais je ne peux pas comprendre d'eux comment résoudre ce problème.

+2

Qu'est-ce qui crée ce fichier? – cletus

+0

Le code entre-t-il dans le bloc catch (IOException ioe) lorsque vous appelez in.close()? –

+0

N'attrapez pas les exceptions que vous ne pouvez pas gérer, puis supprimez-les. Laissez-les se propager à l'appelant ou, au minimum, les enregistrer. –

Répondre

2

Ce qui crée le fichier? Je ne vois que la lecture puis la suppression dans ce code.

choses à surveiller:

  • Lecture d'un fichier nécessite des autorisations de lecture du fichier, mais la suppression du fichier nécessite l'autorisation d'écriture à partir du répertoire ; et
  • Assurez-vous de close() tous les fichiers que vous créez. Si vous ne le faites pas, vous risquez de perdre des données ou il faudra peut-être du temps pour vider une fermeture implicite.

Enfin, l'utilisation d'un attribut comme fileToServe provenant de l'utilisateur est vraiment dangereuse. J'espère que vous êtes en train d'assainir ça ailleurs. Vous devez vous assurer que seuls les fichiers autorisés sont servis de cette manière.

+0

@cletus: il vient en interne. – OscarRyz

1

Ok, j'ai vérifié, après cletus comment, l'endroit où ce fichier est en cours de création. La méthode close sur le flux qui a écrit le fichier était manquante.

Mystère résolu

Cletus, s'il vous plaît ajouter votre réponse afin que je puisse l'accepter

Questions connexes