# alte dateien löschen



## skip2mylou (3. Dez 2007)

Hab eine Frage und zwar befass ich mich grade mit dem Thema Daten und Datenströme und steh vor nem kleinen Problem! dateien löschen etc kein problem nur wollt mal fragen ob man irgendwie bestimmte dateien die zum Beispiel älter als 30 Tage alt sind rausfiltern kann zum löschen? und wenn ja wie stellt man das an?

gruß
skip2mylou


----------



## Niki (3. Dez 2007)

Probiers mal so:


```
final long d = getDate();
		File[] f = new File("C:/Temp").listFiles(new FileFilter(){
			public boolean accept(File pathname) {
				if(pathname.isFile() && pathname.lastModified() < d)
					return true;
				return false;
			}
		});

		private static long getDate(){
			Calendar c = Calendar.getInstance();
			c.add(Calendar.DATE, -30);
		
			return c.getTimeInMillis();
		}
```


----------



## skip2mylou (5. Dez 2007)

Habs mal so probiert, aber ich glaub irgendwie die funktion an die falsche stelle gesetzt oder so! und zwar löscht er bei mir immer noch z.B alle Textdateien aber nicht die die älter als 30 Tage alt sind! (Hab noch nen Button hinzugefügt zum Löschen!)


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Calendar;


import javax.swing.JButton;
import javax.swing.JFrame;

class TxtFileNameFilter implements FilenameFilter
{
	public boolean accept(File f, String s) 
	{
		return s.toLowerCase().endsWith(".txt");
	}
}

public class deletebutton
{
	private static long getDate(){ 
		   Calendar c = Calendar.getInstance(); 
		   c.add(Calendar.DATE, -30); 
		 
		   return c.getTimeInMillis(); 
	}
	public static void deleteTree (File path)
	{
		
		final long d = getDate(); 	
		for (File file : path.listFiles(new TxtFileNameFilter()))
		{
			if (file.isDirectory()&&path.lastModified()<d)
				deleteTree(file);
			file.delete();
			//System.out.println(file);
		}
		path.delete();
		//System.out.println(path);
	}
	
	public static void main (String[] args)
	{
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		JButton b = new JButton ("Löschen");
		ActionListener al = new ActionListener ()
	                {
		        public void actionPerformed(ActionEvent e) 
	    	        {
			deleteTree (new File ("D:/Java/"));
			System.exit(0);
	    	        } 
	                };
	     b.addActionListener(al);
	     frame.add(b);
	     frame.pack();
	     frame.setVisible(true);
		
	}

}
```


----------



## dirk.be (5. Dez 2007)

```
for (File file : path.listFiles(new TxtFileNameFilter())) { 
    if (file.isDirectory() && path.lastModified() < d) 
        deleteTree(file); 
    file.delete(); 
}
```
Da der TxtFileNameFilter hier schon auf die File-Aufzählung innerhalb der for-Schleife wirkt, wird _file.isDirectory() _wohl immer false liefern (abgesehen von Verzeichnissen, deren Name auf ".txt" endet).

Den FilenameFilter solltest Du so implementieren, dass dieser alle Verzeichnisse akzeptiert (damit Du auch die Unterverzeichnisse durchsuchen kannst), aber nur solche Dateien, die älter als 30 Tage sind und auf ".txt" enden:

```
class MyFilenameFilter implements FilenameFilter 
{
   private long getDate() { 
      Calendar c = Calendar.getInstance(); 
      c.add( Calendar.DATE, -30 );
     
      return c.getTimeInMillis(); 
   }

   public boolean accept( File f, String s ) 
   { 
      if ( f.isDirectory() ) 
         return true; 
      
      return s.toLowerCase().endsWith( ".txt" ) && f.lastModified() < getDate();      
   } 
}
```


----------



## skip2mylou (12. Dez 2007)

mein code sieht jetzt so aus


```
package Directory;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Calendar;


import javax.swing.JButton;
import javax.swing.JFrame;

class TxtFileNameFilter implements FilenameFilter 
{ 
   private long getDate() { 
      Calendar c = Calendar.getInstance(); 
      c.add( Calendar.DATE, -30 ); 
      
      return c.getTimeInMillis(); 
   } 

   public boolean accept( File f, String s ) 
   { 
	if ( f.isDirectory() ) 
                    return true;    
                return s.toLowerCase().endsWith( ".txt" ) && f.lastModified() < getDate();      
   } 
} 


public class deletebutton
{
	public static void deleteTree (File path)
	{
		
		for (File file : path.listFiles(new TxtFileNameFilter()))
		{
			if (file.isDirectory())
				deleteTree(file);
			//file.delete();
			System.out.println(file);
		}
		//path.delete();
		//System.out.println(path);
	}
	
	public static void main (String[] args)
	{
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		JButton b = new JButton ("Löschen");
		ActionListener al = new ActionListener ()
	    {
			public void actionPerformed(ActionEvent e) 
	    	{
				deleteTree (new File ("D:/Java/"));
				System.exit(0);
	    	} 
	    };
	    b.addActionListener(al);
		frame.add(b);
		frame.pack();
		frame.setVisible(true);
		
	}

}
```

Das Problem ist jetzt, dass ich wieder alle Dateien im Ordner angezeigt bekomme und nicht nur txt Dateien und Dateien die älter als 30Tage alt sind. Wenn ich Zeile 12 und 13 wegnehme, zeigt er mir Txt Dateien an, aber das Problem dabei ist, dass sich diese Altersabfrage dann auf den Ordner und nicht auf die Dateien bezieht, sprich wenn ich eine neue Datei hinzufüge, er mir dann wieder keine Dateien anzeigt, weil das Änderungsdatum des Ordners ja wieder das aktuelle datum ist.


----------



## skip2mylou (17. Dez 2007)

kann mir da wirklich keiner weiterhelfen?
würd mich sehr über eine Antwort freuen!

schonmal danke im vorraus!


----------



## Giftstachel (17. Dez 2007)

zeile 12: import javax.swing.JButton;
zeile 13: import javax.swing.JFrame;

???


----------



## Guest (17. Dez 2007)

Nimm doch einen richtigen FileFilter und nicht den FileNameFilter, dann kannst du über den FileFilter auch gleich die zu "neuen" Dateien gar nicht mit anzeigen lassen


----------



## Guest (17. Dez 2007)

vielen dank! 
hab jetz den FileFilter benutzt, eigentlich voll der schwachsinn, dass ich den nicht direkt genommen habe!

@giftstachel --> die beiden Zeilen brauch ich doch für mein Fenster und meinem Button ;-)


----------



## WellWok (12. Sep 2008)

Hallo!
Ich wuerde Clone Remover empfehlen. 
Ich benutze es selbst, denn ich meine, dieses Programm ist sehr gut und schnell. 
Clone Remover kann doppelte Dateien vollständig löschen.


----------

