# Servlet - Datei kann nicht gelöscht werden



## sindylee2 (20. Jul 2011)

Hallo Zusammen, ich habe ein Servlet geschrieben, darin wollte ich "file.renometo(destinationfile)" benutzen,kann diese Klasse jedoch nicht immer funktionieren, dann versuche ich mit "read file" und "file.delete()" zu ersetzen, aber leider die Datei kann nicht gelöscht werden, was habe ich falsch gemacht?


```
boolean okay = true;
                
                if(filenameFrom.equals(filenameTo) == false)
                {
                	okay = false;            
                	if(fileFrom.isFile() == true)
                	{
                		try
                		{
                			File parentDir = fileTo.getParentFile();
                			parentDir.mkdirs();
                		} catch(Exception all){}

                		okay = true;

                		try
                		{                			
                			FileInputStream fis = new FileInputStream(fileFrom);
                			FileOutputStream fos = new FileOutputStream(fileTo);
                			byte[] bytes = new byte[40960];
                			int len = 0;

                			while((len = fis.read(bytes)) >= 0)
                			{
                				fos.write(bytes, 0, len);
                			}
                			
                			fis.close();
                			fos.flush();
                			fos.close();

                		} catch(Exception all)
                		{
                			okay = false;
                		}   
                		//fileFrom.setWritable(true);  Dies kann nicht kombliert werden????
                		fileFrom.delete();  
                		okay = fileFrom.exists() == false;
                	}   
                	
                
                }
```


Hilfe;(


----------



## SlaterB (20. Jul 2011)

ist das nur speziell in einem Servlet so oder auch wenn du ein normales Java-Programm auf dem entsprechenden Rechner laufen läßt?
dass der Server nicht im Dateisystem eines Clients herumfuhrwerken kann ist klar, oder?

ist es reproduzierbar immer dieselbe Datei/ derselbe Vorgang?
kommt es zu Exceptions, zum catch in Zeile 32? wenn die Streams dann noch offen sind geht das Löschen vielleicht nicht,
üblicherweise gehören die close()-Aufrufe in einen finally-Block, damit sie auch  bei Exceptions ausgeführt werden


----------



## sindylee2 (20. Jul 2011)

also es passiert nur beim Servlet, wenn es lokal läuft, das funktioniert perfekt. Die Zeile 32 kann keine Exceptions fangen. Es scheint, das "fileFrom.delete()" wurde tatsächlich fehlerlos ausgeführt, aber danach existiert die Datei trotzdem immer noch!


----------



## maki (20. Jul 2011)

Welche Datei willst du denn löschen bzw. wo liegt sie denn?


----------



## sindylee2 (20. Jul 2011)

fileFrom:  Quelle 
fileTo: Ziel
Sie liegen in verschiednen Ordner, Ich möchte die fileFrom zuerst zu den Ort kopieren, wo fileTo liegt, danach lösche ich fileFrom. Bis jetzt funktioniert der erste Schritt schon, aber der 2.Schritt kriege ich nicht hin.


----------



## maki (20. Jul 2011)

Auf meine Frage "Wo liegen sie denn? antwortest du im Ernst mit "fileFrom soll gelöscht werden"?

Hatte schon mit konkreten Pfaden als Antwort gerechnet


----------



## sindylee2 (20. Jul 2011)

Am Anfang habe ich gesagt: ich möchte so machen:

fileFrom.renameTo(fileTo) = 1. read fileFrom and write to fileTo
                                       2. fileFrom.delete();


----------



## freez (21. Jul 2011)

Wird die Datei vielleicht automatisch wieder erstellt? Ist die Datei vielleicht blockiert?


----------



## freez (21. Jul 2011)

```
okay = fileFrom.exists() == false;
```
 Dieser Code überschreibt doch dein okay im Catch Block. Woher weist du, ob der Catch Block angesprungen wurde? Wichtig wäre auf alle Fälle ein all.printstackTrace() in deinem Catch Block. Sonst kannst du später nie sehen, warum etwas nicht funktioniert hatte. Gerade wenn du es in einem Servlet laufen hast und du unter Umständen erst Tage später einen Fehler in der Funktion deiner Anwendung feststellst, helfen die die Log Files deines Servers dann weiter.


----------



## sindylee2 (21. Jul 2011)

Heute habe ich den Kode wieder mal ausgeführt und entdeckt, dass das Problem liegt gar nicht auf dem Servlet, sondern auf der Klientseite. Also die Datei wurde irgendwann blockiert. Sogar ich habe das ganze Programm schon beendet, die Datei blockiert sich immer noch, nur bis ich das Tomcat unterfahre dann kann die freigegeben werden. Aber ich weiß nicht warum, und wann, wo wurde die Datei blockiert. Habt ihr welche Ideen oder Methode, die Ursache zu finden?


----------



## FArt (21. Jul 2011)

In der Regel liegt das da dran, dass Streams, mit denen auf die Datei zugegriffen wurden, nicht geschlossen wurden.

Streams schließt man (sicher) nachdem man sie nicht mehr benötigt in einem finally-Block. In deinem Code werden im Fall einer Exception die Streams nicht geschlossen. Siehe z.B. Java: how not to make a mess of stream handling


----------



## sindylee2 (21. Jul 2011)

Ich habe mit "finally" ausprobiert, leider funktioniert es immer noch nicht.....

```
boolean okay = true;
                
                if(filenameFrom.equals(filenameTo) == false)
                {
                    okay = false;            
                    if(fileFrom.isFile() == true)
                    {
                        try
                        {
                            File parentDir = fileTo.getParentFile();
                            parentDir.mkdirs();
                        } catch(Exception all){}
 
                        okay = true;
 FileInputStream fis = null;
FileInputStream fos  = null;
                        try
                        {                           
                            fis = new FileInputStream(fileFrom);
                            fos = new FileOutputStream(fileTo);
                            byte[] bytes = new byte[40960];
                            int len = 0;
 
                            while((len = fis.read(bytes)) >= 0)
                            {
                                fos.write(bytes, 0, len);
                            }
                        } catch(Exception all)
                        {
                            okay = false;
                        }   
                        //fileFrom.setWritable(true);  Dies kann nicht kombliert werden????
finally{
try{
if(fis != null) fis.close();
if(fos != null) {
fos,flush();
fos.close();
}
}
catch(Exception e){
throw new Exception("Cannot close file: "+fileFrom.getAbsolutePath());
}
}
                        fileFrom.delete();  
                        //okay = fileFrom.exists() == false;
                    }   
                    
                
                }
      //if(okay == false) print error message into log file. //hier wird immer Fehlermeldung in Log-Datei eingeschrieben. und Die Datei wurde nicht gelöscht
```


----------



## FArt (21. Jul 2011)

Fileschnittstellen sind keine gute Schnittstelle. Trotzdem musst du wohl mit einer arbeiten. Somit müssen natürlich alle Beteiligten sauber mit Streams umgehen und diese nach Gebrauch sicher schließen.

Du solltest auch sauber arbeiten: benutze Logging, damit du nicht raten musst, was in deinem Code passiert und benutze bei Problemen einen Debugger. Versuche das Problem im Kleinen nachzustellen. Exceptions sind Ausnahmen. Logge diese zumindest. Auch andere Rückgabewerte sind es wert, berücksichtigt zu werden (z.B. File (Java 2 Platform SE v1.4.2)). 

Ich habe mir deinen Code nicht genau angesehen (auch weil er schlimm formatiert ist). Auf jedem Fall ist er sehr unstrukturiert. Obwohl er sehr einfach ist, sieht man ihm nicht sofort an, was er erledigen soll.

Und immer dran denken: wenn ein Verzeichnis nicht gelöscht werden kann, ist es in der Regel nicht leer. Sonst sind in der Regel die Streams nicht richtig geschlossen bzw. eine andere Applikation hält die Datei noch offen (Windows).


----------

