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?
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();
}
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!)
Code:
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);
}
}
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:
Code:
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();
}
}
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.
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
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.