Alte Dateien aus sämtlichen Subverzeichnissen löschen

Ja, das Problem hat sich erledigt.
Es ist zwar bislang nicht die Code- und Leistungs-sparendste Lösung, aber immerhin tut das Programm schon mal genau das, was es auch tun soll. Nicht mehr und auch nicht weniger.

Falls es dich interessiert, wie ich es gelöst habe, hier der Code:
Und bitte: bewerft mich nicht mit Steinen, wenn ihr seht, wie viel unnötigen Code ich da reingebastelt habe :p

Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Vector;


public class Main
{	
	public static boolean noFurtherDirectories;

	public static void main(String[] args)
	{
		File file = new File(args[0]);		
		myMethod(file);
	}
	
	public static void myMethod(File directory)
	{	
		File[] files = directory.listFiles();
		
		File fileOne = new File("C:/Tests"); // Puffer-File 1
		File fileTwo = new File("C:/Tests"); // Puffer-File 2
		
		Vector<File> vec = new Vector<File>();
		
		// Eine Datei oder ein Verzeichnis vorhanden/zugreifbar?
		if(files!=null)
		{	
			// Beim letzten Verzeichnis des Verzeichnisbaums angelangt?
			for(File file : files)
			{
				files = directory.listFiles();
				
				if(file.isDirectory()==false)
					noFurtherDirectories=true;
				else
					noFurtherDirectories=false;
			}
			
			// Jede Datei im Verzeichnis überprüfen
			for(File file : files)
			{
				files = directory.listFiles();
				
				// Ist es ein Verzeichnis?
				if(file.isDirectory()==true)
				{
					// Neuste Datei des vorherigen Verzeichnisses ermitteln
					for(int i=0; i<vec.size(); i++)
					{
						if(vec.get(i).lastModified()>fileOne.lastModified())
							fileOne = vec.get(i);
					}
					// 2. neuste Datei des vorherigen Verzeichnisses ermitteln
					for(int i=0; i<vec.size(); i++)
					{
						if(vec.get(i).lastModified()>fileTwo.lastModified() && vec.get(i).lastModified()<fileOne.lastModified())
							fileTwo = vec.get(i);
					}
					// Alle Dateien aus Puffer-Liste löschen
					vec.removeAllElements();
					// Pfad des oberen Verzeichnisses im Verzeichnisbaum ermitteln
					File parent = new File(file.getParent());
					// Aufruf der Lösch-Methode
					delete(parent, fileOne, fileTwo);
					// Die Methode ruft sich selber auf
					myMethod(file);
				}
				else // Ist es eine Datei?
					vec.add(file); // Der Puffer-Liste die momentane im Fokus stehende Datei hinzufügen
			}
			
			// Wenn kein Unterverzeichnis mehr vorhanden
			if(noFurtherDirectories == true)
			{
				for(File file : files)
				{
					for(int i=0; i<vec.size(); i++)
					{
						if(vec.get(i).lastModified()>fileOne.lastModified())
							fileOne = vec.get(i);
					}
					for(int i=0; i<vec.size(); i++)
					{
						if(vec.get(i).lastModified()>fileTwo.lastModified() && vec.get(i).lastModified()<fileOne.lastModified())
							fileTwo = vec.get(i);
					}
					
					vec.removeAllElements();
					
					//Aufruf Lösch-Methode, jedoch mit dem Pfad des momentanen Verzeichnisses
					delete(directory, fileOne, fileTwo);
				}
			}
		}
		else // Nicht lesbar oder keine zugriffsrechte?
			System.out.println("Keine Berechtigung...");
		
	}
	
	// Lösch-Methode
	public static void delete(File directory, File fileOne, File fileTwo)
	{
		File[] files = directory.listFiles();
		
		if(files!=null)
		{	
			for(File file : files)
			{
				files = directory.listFiles();
				
				// Ist es eine Datei? (Kein Verzeichnis)
				if(file.isFile())
				{
					// Wenn nicht die neuste oder 2. neuste Datei
					if(file.equals(fileOne)==false && file.equals(fileTwo)==false)
						file.delete(); //löschen
				}
			}
		}
		else
			System.out.println("Keine Berechtigung...");
	}

}

Momentan bin ich aber noch an einer "besseren" und auch schöneren Lösung dran, bei der man als zusätzlicher Parameter noch mitgeben kann, wie viele der neusten Dateien behalten werden sollen.
 
Hallo Zusammen

Nach langen Testphasen, kam das Programm nun zum Einsatz.
Es ergab sich jedoch ein Problem: Die Abfragen scheinen nur für gewisse Datentypen zu funktionieren.
Alles andere löscht es gnadenlos. Egal wie alt oder wie viele Dateien insgesamt da sind.

Das skurrile ist, dass das Programm beim Windows XP genau so funktioniert, wie man es von ihm erwartet.

Beim Windows Server 2008 R2 und (wie ich nachher durch einen Test bestätigen konnte) Windows 7 funktioniert das Programm nur bei gewissen Datentypen...
Ich habe ein paar Datentypen getestet und richtig funktionieren tut es bei BackUp Files und Bitmap Dateien.
Nicht zu funktionieren scheinen die Typen: txt, rtf, log, jpeg, png, zip und wahrscheinlich noch viele mehr.


Wie zum Teufel kann das sein?!

_______________________________________________________________________________________

Ok, habe wahrscheinlich herausgefunden, wieso das bei Windoof 7 passiert.
In Windoof 7 gibt es bei vielen Dateien kein "Zuletzt geändert"-Attribut. Nur ein "Erstellt am".
Darum gibt mir die File.lastModiefied() Methode immer "0" zurück.

So habe ich nun nach einer Methode gesucht, die das Erstellungsdatum ermittelt, jedoch vergebens.

Gibt es eine intelligente Alternative zur lastModified() Methode?
Irgend etwas, dass die Erstellungszeit zurück gibt?
 
Zuletzt bearbeitet:
Ich habe mal ein wenig gegoogelt. Allerdings nur eine Lösung in C++ für Windows gefunden. Die könntest du über eine native Methode in dein Programm einbauen. Das ist allerdings ein wenig schwirieger und man muss dafür zumindest ein bisschen C++ können. Solltest du das nicht können müsste dir dein Chef evtl. unter die Arme greifen.
Ansonsten würde ich auch wohl den C++ teil übernehmen, das wäre eine schöne Übung für mich. Allerdings ist es ja deine Aufgabe.
 
Hatte die Seite die ganze Zeit als einen Tab im Opera und bin zufällig wieder drüber gestolpert ^^

Also, das Thema ist gegessen.
Ich habe es einfach mit PowerShell realisiert. 10x einfacher, 10x Code-sparender (auch wenn die Syntax etwas gewöhnungsbedürftig ist..)

Wen es interessiert, hier die Lösung in PowerShell (mit Übergabeparametern 'Pfad' und 'Anzahl zu behaltende Dateien'):
Code:
$startDirectory = $args[0]
$numberOfSaves = $args[1]

cd $startDirectory
  
ls -recurse | foreach($_){
  if(!$_.PSIscontainer){
    ls *.* | ? {!$_.psiscontainer} | sort LastWriteTime -desc | select -skip([int]$numberOfSaves) | del
  }
  if($_.PSIscontainer){
    ls $_.pspath | ? {!$_.psiscontainer} | sort LastWriteTime -desc | select -skip([int]$numberOfSaves) | del
  }
}
 
Zurück