# Kann Tiff Datei nicht löschen



## Doret (7. Mai 2009)

Hey,

so mein erster Post, und direkt ne frage...

alsoich hab ein sehr blödes problem, und zwar hab ich die aufgabe, aus gegebenen Tif-Dateien (in der Regel sinds 2) eine Multipage-Tiff-Datei zu erstellen, und anschließend die beiden anderen löschen. Das erstellen der Multipage-Tiff-datei funktioniert auch, da bin ich schon sehr stolz auf mich gewesen nur das löschen der beiden Dateien bereitet mir kopfzerbrechen...


```
CMultipageTiff.createMultipageTiff(TiffFileNames, OutputDirectory, tifname[2] );
CHelper.deletefiles(TiffFileNames)
```

in dem String Array "Tiff File Names" stehen alle Pfade, von den Tiffdateien drin, die zu einer Multipage Tiff, Datei werden sollen.

die Klasse CMultipageTiff, mit ihren Funktionen sieht so aus:


```
public static void saveAsMultipageTIFF(RenderedImage[] image, String file, String targetpath )
	       throws java.io.IOException{
	      String filename = file;
	      if(!filename.endsWith(".tif"))filename = new String(file+".tif");
	      OutputStream out = new FileOutputStream(targetpath+filename);
	      TIFFEncodeParam param = new TIFFEncodeParam();
	      ImageEncoder encoder = ImageCodec.createImageEncoder("TIFF", out, param);
	      Vector vector = new Vector();
	      for(int i=1;i<image.length;i++) {
	          vector.add(image[i]);
	      }
	      param.setExtraImages(vector.iterator());
	      encoder.encode(image[0]);
	      out.close();
	   }

	   public static void createMultipageTiff(String[] filenames, String targetpath, String filename){
	      RenderedImage image[] = new PlanarImage[filenames.length];
	      for(int i=0;i<filenames.length;i++) {
	          image[i] = readAsPlanarImage(filenames[i]);
	      }
	      try {
	         saveAsMultipageTIFF(image, filename, targetpath);
	      }
	      catch (Exception e) {e.printStackTrace();}
	   }
```

Wenn ich keien Multipage Dateien erstelle sondern nur die Zeile: 

```
CHelper.deletefiles(TiffFileNames)
```
 ausführen lasse, funktioniert das löschen. Andern falls liefert mir inputfile.delete(); "false" zurück und die Datei bleibt weiterhin bestehen. Es muss also wohl irgendwie daran liegen, dass irgendwo die Datei, die ich löschen will noch verwendet wird, richtig? Leider weiß ich nicht wo das der fall sein könnte.
Ich hoffe ihr könnt mir helfen, danke schonmal!

mfg

Doret

EDIT: ich glaub ich hab ins falsche forum gepostet...


----------



## Ebenius (7. Mai 2009)

Wie erstellst Du denn die Images aus den Eingangsdateien? Sicher lässt Du einen Strom offen. Das führt -- je nach Betriebssystem -- zu einer Sperrung der Datei.

Ebenius


----------



## Doret (7. Mai 2009)

das ist eine gute frage, ich hab auch nur die Library JAI eingebunden und bin dann nach dem Beispielcode eines Tutorials vorgegangen.

import java.awt.image.RenderedImage;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import com.sun.media.jai.codec.*;
 habe ich importiert..


----------



## Ebenius (7. Mai 2009)

Probier mal PlanarImage.dispose() vor dem Löschen. Vielleicht hilft das.

Ebenius


----------



## Doret (7. Mai 2009)

Hi,

ich komm gard nich ganz klar, wie ruf ich dei funktion dispose() denn genau auf?

PlanerImage.dispose() 

kentn er nicht

und ein objekt der Klasse PlanerImage, kennt die Funktion auch nicht...

(ich hab das innerhalb der CMultipageTiff klasse versucht)


----------



## Ebenius (7. Mai 2009)

So vielleicht? Probier's mal, ich hab's nicht getestet: 
	
	
	
	





```
public void createMultipageTiff(String[] filenames){
   RenderedImage image[] = new PlanarImage[filenames.length];
   for(int i=0;i<filenames.length;i++) {
       image[i] = readAsPlanarImage(filenames[i]);
   }
   try {
      saveAsMultipageTIFF(image, "multipagetiff");
   }
   catch (Exception e) {e.printStackTrace();}
   for(int i=0;i<image.length;i++) {
       image[i].dispose();
   }
}
```
Ebenius


----------



## Doret (7. Mai 2009)

ah also nu weiß ich wie ich dispose aufrufen kann,Danke! Aber leider klappts immernoch nicht 

ich bin zumindest ein step weiter es muss an der zeile liegen:

encoder.encode(image[0]) ;

denn wenn ich diese auskommentier kann ich löschen...


----------



## Doret (8. Mai 2009)

Hi,

ich komm immer noch nicht weiter ich hab nun mal veruscht

die CHelper.deletefiles funktion mit deleteonexit() zu ändern


```
for (String item: filepaths)
  		{ 
  			try{
				File inputfile = new File(item);				
				System.out.println(inputfile.getAbsolutePath());
				inputfile.deleteOnExit();				
  			}catch(Exception ex)
  			{
  				
  			} 
  		}
```
nun schaff ich es immerhin 2 von den insgesamt 6 dateien zu löschen

allerdings nur die beiden mittleren, die ersten beiden und die letzten beiden sind nachwievor da..


----------



## Ebenius (8. Mai 2009)

Das da hab ich gefunden: JAI FAQ: Why can't I delete a file that I read in using the "FileLoad" operator? Ich votiere für Variante 2; nutze nicht den "FileLoad"-Operator, sondern den "Stream"-Operator und schließe die Ströme selbst. Ich hab eigentlich keine Ahnung von JAI, aber es scheint derzeit kein anderer helfen zu können. Probier mal aus, ob Du das umstellen kannst.

Ebenius


----------



## Doret (8. Mai 2009)

Hi,

Du biste ein Gottverdammtes Genie! Es funktioniert.. aber darauf muss man erst mal kommen... das Objekt PlanarImage zu erstellen und dann als bufferedimage zurückgeben.. und nicht nur ein PlanarImage zurückgeben... was für eine dreckehürde


```
public static BufferedImage readAsPlanarImage(String filename) {
			PlanarImage pi = JAI.create("fileload", filename);
	      return pi.getAsBufferedImage();
```

Tausend Dank!


----------



## Doret (8. Mai 2009)

Hi,

ein letztes mal melde ich mich, weil ich grade nen schock bekommen hab, es ging nämlcih plötzlich nicht mehr, aber ich weiß auch worans lag!

und zwar inder Funktion safeAsMultiPageTiff


```
public static void saveAsMultipageTIFF(RenderedImage[] image, String file, String targetpath,String[] filenames )
	       throws java.io.IOException{
	      String filename = file;
	      if(!filename.endsWith(".tif"))filename = new String(file+".tif");
	      OutputStream out = new FileOutputStream(targetpath+filename);
	      TIFFEncodeParam param = new TIFFEncodeParam();
	      Vector vector = new Vector();
	      for(int i=1;i<image.length;i++) {
	          vector.add(image[i]);	          
	      }	      
	      param.setExtraImages(vector.iterator());
	      ImageEncoder encoder = ImageCodec.createImageEncoder("TIFF", out, param);
	      
	      encoder.encode(image[0]);
	      vector.clear();
	      image = null;
	      encoder = null;
	     ------- System.gc(); -------     !!!!!!!!!!!!!!!!!!!!!
	      out.close();	      
	   }
```

ist es ganz wichtig den Garbagecollector aufzurufen, der gibt die dateien wieder frei! sicehrheitshalber hab ich auch mal die objekte image und encoder genullt und den vector gecleared. aufjedenfall klappts jetzt


----------



## max40 (8. Mai 2009)

nur weil der aufgerufen wird, bedeutet diese nicht das er auch gleich anfängt aufzuräumen! also kannst es sein das du beim 4 oder 10 oder wie auch immer wieder auf deinen fehler kommst!


----------



## Ebenius (8. Mai 2009)

max40 hat gesagt.:


> nur weil der aufgerufen wird, bedeutet diese nicht das er auch gleich anfängt aufzuräumen! also kannst es sein das du beim 4 oder 10 oder wie auch immer wieder auf deinen fehler kommst!


Richtig. Aus dem Grund schrieb ich oben: Nimm den zweiten Lösungsvorschlag. Auf den Garbage Collector darf man sich aus verschiedenen Gründen nicht verlassen. Mach lieber einen FileInputStream auf jedes der Bilder auf, lies das PlanarImage mit dem "Stream"-Operator vom FileInputStream, hol Dir das BufferedImage aus dem PlanarImage und dann schließ den FileInputStream. Das sollte sauber funktionieren und ist nicht wirklich schwieriger.

Viel Erfolg,
Ebenius


----------

