Alte Dateien aus sämtlichen Subverzeichnissen löschen

PsychedelicSpark

Grünschnabel
Hallo Miteinander

Ich habe ein Problem und komme einfach nicht mehr weiter...


Was das Programm tun soll:
Das Programm soll sämtliche Subverzeichnisse durchstöbern und alle Dateien - ausser die 2 neusten - in den Verzeichnissen löschen.

Mein Problem:
Durch ein paar Foren und sonstige Internetseiten entdeckte ich die Klasse File.
Mit dieser habe ich es auch geschafft, alle Unterverzeichnisse und auch die darin enthaltenen Dateien rekursiv aufzustöbern und auch bis auf die neuste zu löschen. So weit so gut.
Der Haken an der Sache ist jedoch, dass jeweils die 2 neusten Dateien erhalten bleiben sollen.


Ich habe es mal so probiert:
Java:
public class Main
{
	public static File file = new File("C:/Tests");
	
	public static void main(String[] args)
	{
		myMethod(file);
	}
	
	public static void myMethod(File directory)
	{
		File[] files = directory.listFiles();
		if(files!=null)
		{
			for(int i=0; i<files.length; i++)
			{
				if(files[i].isDirectory()==true)
				{
					myMethod(files[i]);
				}
				else
				{
//					files = directory.listFiles(); // wenn ich die Liste aktualisiere, kriege ich mit der Zeit einen "Index out of bounds"
					for(File file : files)
					{
						files = directory.listFiles();
						if(file.lastModified()<files[i].lastModified() && files.length>2) //Wenn die letzte modifizierte Zeit kleiner (also älter) UND mehr als 2 Dateien vorhanden sind, löschen - was jedoch nicht zu funktionieren scheint...
							file.delete();
					}
				}
			}
		}
		else
			System.out.println("Keene Berechtigung...");
	}

}

Ich habe das Gefühl, dass die "Liste" sich nicht aktualisiert, wenn eine Datei darin gelöscht wird.
So dachte ich mir, dass ich sie einfach aktualisieren kann (mit dem auskommentierten Befehl).
HA! Falsch gedacht.
Wenn ich den Befehl aufrufe, dann gibt es mitten im Ablauf einen "Index out of bounds" Error und das Programm macht auch nicht gerade das, was ich von ihm erwarte.


Ich habe es hunderte mal gedreht und gewendet, ohne Erfolg.
Ich hoffe, ihr könnt mir helfen :s
 
Ich würde einen anderen Ansatz wählen. Ich würde es bei der einer Schleife belassen, und Variablen für zwei Files erstellen. In die packt man dann die beiden neusten Files die man bisher gefunden hat. Findet man dann ein noch neueres löscht man das ältere der beiden gesicherten Files und merkt sich das neuere. Reicht dir die Beschreibung oder soll hilft dir Quelltext mehr?
 
... und ich hätte den Scan-vorgang mit

File[] files = directory.listFiles();

immerwieder unternommen, bis das Verzeichnis leer ist.
Ungefähr so :


File[] files = directory.listFiles();
int anzahl = files.length;
if(anzahl > 0)
{//man nehme eine Datei, z.B.
// File file = files[0];
//gibt eventuell einen Warnhinweis aus:
//JOptionPane.showMessageDialog(null,"Datei :\n"+file.getName()+"\nwird gelöscht","bereit zum Löschen",2,null);
//die Datei wird gelöscht:
// file.delete();
//man scanne das Verzeichnis erneut:
//files = directory.listFiles();
//und prüft die Länge des Array :
anzahl = files.length;
und so weiter ...
}
else
{
//jetzt ist das Verzeichnis leer
}

Entschguldige, dass meine Tipperei nicht java-formatiert ist, ich weiss nicht, wie man dies hier tut

Nach Wunsch kann ich es mit Eclipse versuchen.
Es gibt bestimmt noch viele anderen Wege.
Das Auflisten der Dateien ist mit moderner Hardware nicht besonders Speicherinstensiv, deswegen wurde ich die Lösung als modern ansehen, Gegenstimmen sind willkommen.
 
Hi,

@klein-odd
Java-Code kann man so posten:
[code=java] (VOR dem Code)
[/code] (NACH den Code)

sieht dann z.B. so aus:
Java:
System.out.println("How to post Java-Code");

Gruß
 
Hallo Leute.

Ich habe es nun endlich geschafft, diese Aufgabe zu meistern.
Ein dickes Dankeschön an Technoblade. Der Ansatz mit den 2 Puffer Dateien hat mir sehr geholfen :)


Nun habe ich aber ein neues Problem...
Mein Chef meinte, dass man in der Lage sein sollte, den"Startpfad" selbst anzugeben und das als Parameter.
Also im Stil von java -jar DeleteFiles.jar _"C:/DB Backups"
Gesagt, getan. Ich habe den Code umgeschrieben, sodass es eigentlich funktionieren müsste, aber jedes mal wenn ich das Programm per Konsole mit dem Parameter starte, scheint mein Programm keine Berechtigung zu haben, irgendwas in den Verzeichnissen zu tun.
Wenn ich es mit Eclipse kompiliere und starte, hat er jedoch überhaupt keine Probleme und tut das, was man von ihm verlangt.

Wie kann das sein?
Wenn es an einer Sicherheitsvorkehrung des OS liegt (Win XP Pro), was kann man tun, um dem Programm die benötigte Berechtigung zu erteilen?

_________________________________________________________________________________________

EDIT: Wenn ich den Pfad statisch im Code angebe und die JAR mit einem Doppelklick oder auch per Konsole ausführe, gibt es auch keine Probleme.

Hier noch ein kleiner Code-Schnipsel, wie ich das mit dem Parameter mache:
Java:
public static void main(String[] args)
	{	
		File file = new File(args[0]);		
		myMethod(file);
	}
Die JAR rufe ich dann in der Konsole mit java -jar DeleteFiles.jar _"C:/Tests" auf.


Gruss
PsychedelicSpark
 
Zuletzt bearbeitet:
Lass dir doch mal mit System.out.println(args[0]) ausgeben was von deiner Eingabe auf der Konsole auch im Programm an kommt.
 
Jjjjepp... Habe es auch gerade eben gemerkt ^^i

Ich dachte eben, dass man entweder ein - oder _ schreiben muss, wenn man einen Parameter mitgeben will.

Nun ja.. scheint in dem Fall nicht so zu sein :p


Vielen Dank an alle
So kann ich das Programm ja auch beruhigt an den Chef aushändigen Xd
 
Achso ... die Parameter-Geschichte

Dazu sei dir folgendes gesagt

Ein Programm *auch eine Java-Applikation* kann nach bestimmten Parametern verlangen. Wenn das Programm dies tut gibt es in aller Regel auch vor WIE man diese zu übergeben hat. Es haben sich im Laufe der Zeit die Standards etabliert das man gewöhnlich vor sog. Switches folgende Zeichen setzt : einen einfachen Bindestrich (-) , zwei direkt aufeinander folgende Bindestriche (--) , einen Slash (/) oder garnichts.
Dann trennt man die Switches von den Parameter-Werten meistens mit Leerzeichen oder einem =-Zeichen ...
Wenn in einem Wert ein Leerzeichen enthalten ist ... dieser Wert aber als ein zusammenhängender Parameter übergeben werden soll muss in Abhängigkeit zum Interpreter die signalisiert werden. Zur Zeit hat sich der Standard etabliert das man solche Paramter in doppelte Anführungszeichen setzt ("WERT").

WIE genau man DEINER Applikation aber nun die Parameter übergeben muss das legst du selbst innerhalb der
Java:
public static void main(String[] args)
fast. In Java erhältst du sämtliche übergebenen Parameter nach dem Parameter deiner Klasse an Java selbst als String-Array. Dies weicht von Sprache zu Sprache stark ab.
Mit diesen Strings kannst du nun sämtliche String-Vergleiche anstellen die du willst. Du kannst zum Beispiel in einem foreach durch alle Parameter gehen und prüfen ob sie das von dir geforderte Format aufweisen *z.B. mit Slash für Toggle-Switches ... einfachen Bindestrich für restliche Parameter ... Werte müssen mit "=" verknüpft sein ... und so weiter* und auch Parsen falls du z.B. einen numerischen Wert brauchst / verlangst.
Da du selbst aber deine main-Methode so aufgebaut hast das du nach dem reinen Pfad verlangst musst du ihn dann auch so übergeben.

Ich weis ... klingt kompliziert und unlogisch ... aber genau das ist es auch ... denn jeder Programmierer macht sein eigenes Ding. Es gibt zwar wie auch in Java Konventionen die eine Vorgabe darstellen nach der man sich richten SOLLTE um es wenigstens innerhalb der selben Sprache gleich zu halten ... aber für soetwas Sprachübergreifendes ist das ganz schlicht zu komplex.
 
Ich danke JavaDeveloper für den Tipp.
Ich habe mit den Löschprozedurn experimentiert aber momentan kann
ich keinen sicheren Code zeigen.
Es haben sich Probleme ergeben.

JAVA löscht mur leere Verzeichnisse

Gut finde ich, dass der Problemsteller die Angelegenheit erledigt hat, oder irre ich ?
Ich grüsse allle, Alexander
 
Zurück