# Suche nach der jüngsten Datei.



## EAM (21. Aug 2007)

Hi,
wiedereinmal wende ich mich hoffnungsvoll an das Java-Forum.

Ich möchte eine Methode schreiben die ein Verzeichnis durchsucht und mir anschließend die jüngste Datei (also das Datum als GregorianCalendar) zurückgibt.

Soweit dachte ich eigentlich das es so funktionieren sollte:

```
public GregorianCalendar getNeuestes(File projekt)
     {
         long neuer = Long.MAX_VALUE;
         GregorianCalendar gc = new GregorianCalendar();
         File[] liste = projekt.listFiles();
         for(File fil:liste)
         {
             if(fil.isFile())
             {
                 if(fil.lastModified()<neuer)
                     neuer = fil.lastModified();
             }
             else if(fil.isDirectory())
             {
                 GregorianCalendar g = getNeuestes(fil);
                 if(g.getTimeInMillis()<neuer)
                     neuer = g.getTimeInMillis();
             }
         }
         gc.setTimeInMillis(neuer);
         return gc;
     }
```


----------



## SlaterB (21. Aug 2007)

es macht großen Sinn, auch eine Frage zu stellen,
(außer 'findet alle Probleme selber und bietet mir eine fertige Lösung')


Tipp: bei den rekursiven Aufrufen musst du nicht ständig zwischen long und Calendar wechseln,
arbeite in der ganzen Operation nur mit long,
das Endergebnis dann in einer separaten umhüllenden Operation gerne in Calendar umwandeln


----------



## EAM (21. Aug 2007)

Danke für den Tipp...

Naja was sollte ich den Fragen? Außer das es halt nicht stimmt weiß ich ja auch nicht mehr...


----------



## SlaterB (21. Aug 2007)

wie zeigt sich denn der Fehler?
was sind deine Testdaten, was kommt jeweils für ein lastModified()-Wert raus,
wie werden diese Werte verarbeitet,
was ist das erwartete und erhaltene Endergebnis, + Zwischenergebnis nach jedem Schritt (jede Datei)?

das sind die ganz simplen Schritte mit denen du das alles selber herausfinden kannst,
und lasse unbedingt die Rekursion weg, ignoriere Directories,
das sollte erstmal in EINEM Verzeichnis laufen


----------



## EAM (21. Aug 2007)

Tja das hab ich jetzt ja auch schon 1,5 Tage lang gemacht...

Also ich hab alle Änderungen anzeigen lassen... und das ergibt für mich keinen Sinn mal wird das "jüngste" Datum älter und mal jünger...


----------



## SlaterB (21. Aug 2007)

vielleicht ist die Reihenfolge der Liste, die listFiles(); zurückliefert, zufällig
von solchen Späßen solltest du dich aber nicht abhalten lassen,
fange übrigens mit einem Verzeichnis mit nur 2 Dateien an, die beiden Fälle wirst du überblicken können,

und dann gehts Schritt für Schritt los,
aus

```
if(fil.isFile()) 
{ 
   if(fil.lastModified()<neuer) 
        neuer = fil.lastModified(); 
}
```
wird

```
if(fil.isFile()) 
{ 
   System.out.println("file: "+name+ lastModified);
   System.out.println("altes neuestes war: "+neuer+ ist aktuelles File neuer? true/ false);

   if(fil.lastModified()<neuer) 
        neuer = fil.lastModified(); 

   System.out.println("neues neuestes ist nun: "+neuer);

}
```
usw usf

erstelle dir ein genaues Log, was das Programm macht

--------

wenn du Probleme mit diesem Logging hast, dann frage im Detail nach,
einfach nur '1,5 Tage lang gemacht + geht nicht' hilft nicht weiter

wenn dir das alles fremd ist und du nur die fertige Lösung willst,
dann entschuldige die Störung


----------



## EAM (21. Aug 2007)

Mein Beispiel:
Ich übergebe einen Ordner mit 10 Unterordnern....
und für diese 10 Ordner bekomme ich zurück:

10.09.2003
27.10.2003
27.10.2003
27.10.2003
27.10.2003
18.12.2002
27.10.2003
27.10.2003
27.10.2003
27.10.2003

wenn ich aber im Explorer nachsehe, finde ich fast in jedem Ordner Dateien die jünger sind als diese Daten...
Oh hab deine Antwort erst jetzt bemerkt... 
Danke für die Hilfe ich dachte nur vielleicht hab ich einen gröberen Gedankenfehler den jemand anders eventuell schneller findet...

Ansonsten muss ich noch herumbasteln...


----------



## SlaterB (21. Aug 2007)

wie gesagt: Unterordner interessieren im ersten Schritt nicht die Bohne,
versuche das Programm für ein Verzeichnis zum Laufen zu bringen,
idealerweise erstmal nur mit 2 Dateien drin, dann langsam besser werden


----------



## EAM (21. Aug 2007)

Ich habe jetzt ein detailierteres Problem:
Ich habe einen Ordner mit 4 dateien...
Das Programm erkennt die erste Datei als jünger (klar weil ja long.max-value).
So jede weitere Datei in diesem Ordner ist aber noch jünger... 
trozdem passiert hier nichts mehr und er gibt mir das Datum der ersten Datei aus.

Meine Frage:

Bricht aus irgendeinem Grund die for-Schleife ab?
Ist meine Abfrage Schuld daran, dass die restlichen Dateien nicht als jünger erkannt werden?

mfg. EAM


----------



## SlaterB (21. Aug 2007)

ich persönlich weiß es nicht, bei mir läuft alles perfekt,
ich kann nicht absehen, was bei dir so los ist


```
public class Test2
{

    public static void main(String[] args)
    {
        File f = new File("data");
        long l = getNeuestes(f);
        System.out.println("\nEndergebnis:");
        System.out.println(l + ", " + new Date(l));

    }

    public static long getNeuestes(File projekt)
    {
        long neuer = Long.MAX_VALUE;
        String name = "--------";
        File[] liste = projekt.listFiles();
        for (File fil : liste)
        {
            if (fil.isFile())
            {
                long lastModified = fil.lastModified();
                System.out.println();
                System.out.println(neuer + ", " + new Date(neuer) + " = bisher neuestes File : " + name);
                System.out.println(lastModified + ", " + new Date(lastModified) + " = neu untersuchtes File: " +
                                   + fil.getName() + ", neuer?: " + (lastModified < neuer));

                if (lastModified < neuer)
                {
                    neuer = lastModified;
                    name = fil.getName();
                }
            }
        }
        return neuer;
    }
}
```

->

vollständiges Log, welches jede Einzelheit bis in den letzten Millimeter verrät



```
9223372036854775807, Sun Aug 17 08:12:55 CET 292278994 = bisher neuestes File : --------
1187689657955, Tue Aug 21 11:47:37 CEST 2007 = neu untersuchtes File: a.pdf, neuer?: true

1187689657955, Tue Aug 21 11:47:37 CEST 2007 = bisher neuestes File : a.pdf
1187686649959, Tue Aug 21 10:57:29 CEST 2007 = neu untersuchtes File: b.pdf, neuer?: true

1187686649959, Tue Aug 21 10:57:29 CEST 2007 = bisher neuestes File : b.pdf
1187686810430, Tue Aug 21 11:00:10 CEST 2007 = neu untersuchtes File: c.pdf, neuer?: false

1187686649959, Tue Aug 21 10:57:29 CEST 2007 = bisher neuestes File : b.pdf
1187687743776, Tue Aug 21 11:15:43 CEST 2007 = neu untersuchtes File: d.pdf, neuer?: false

Endergebnis:
1187686649959, Tue Aug 21 10:57:29 CEST 2007
```

das Programm sucht natürlich die ÄLTESTE Datei, das weißt du schon?


----------



## EAM (22. Aug 2007)

Aha... naja das hatte ich nicht beabsichtigt...
mal sehen last Modified liefert mir ja die millisekunden seit der letzen änderung...

d.h. wenn der wert größer ist, liegt ja die Änderung länger zurück oder?

Es kann natürlich sein das ich schon so kompliziert denke das ich das nicht check aber was müsste ich dann ändern damit es das jüngste sucht und nicht das älteste?

Aber danke für die Unterstützung!


----------



## EAM (22. Aug 2007)

d.h. ist müsste die long-Variable mit 0 initialisieren und dann das Zeichen umdrehen?

das Versteh ich zwar nicht aber ist das die Lösung?


----------



## SlaterB (22. Aug 2007)

du kennst die Antwort: ob das die Lösung ist wird dir dein Programm im Log verraten 

das scheint jedenfalls ein vielversprechender Ansatz zu sein, ja


----------



## EAM (22. Aug 2007)

Cool danke nochmal aber kannst du mir das erklären?

Weil die Long-Zahl ja größer sein muss wenn die Datei älter ist oder hab da was falsch verstanden?

mfg. EAM


----------



## SlaterB (22. Aug 2007)

hmm, nö, die Zahl long ist ein Datum/ eine Zeit in einer gewöhnungsbedürftigen Darstellung

0 ist 1.1.1970

1000 ist 1.1.1970 + 1 Sekunde

und 897498749334 ist dann irgendwann heute,
je größer Long, desto später in der Zeit,

die jüngste Datei nach deiner Interpretation ist die mit dem höchsten Zeitstempel


----------



## EAM (22. Aug 2007)

Oh aha ... also hab ich das von Grund auf falsch verstanden.... ja dann is mir klar das das nicht funktionieren konnte.... (dann tu ich mir mit dem log auch leichter) lol Danke schöne Ferien noch (sofern du noch Schüler bist)


----------



## NTB (22. Aug 2007)

aber wenn Du das Log schon nicht verstanden hast, dann hättest Du doch einen klareren Ansatzpunkt gehabt. 
Mach das nächstes Mal genauso, wie SlaterB es Dir vorgeschlagen hat: JEDEN einzelnen Schritt entweder debuggen, oder eben per Log ausgeben.
Und eben auch nicht gleich das ganze Haus bauen, sondern vielleicht erstmal eine Wand.


----------



## SlaterB (22. Aug 2007)

// edit: verpostet, falsches Topic offen


----------



## m4uz (3. Sep 2007)

Hi SlaterB:

Erstmal Danke für den Link hier in den Thread.
Allerdings habe ich noch eine Frage.
Du hast in Deinem Code, wenn ich es richtig verstanden habe, den Ordner "Data" angegeben. Was aber nun, wenn ich nicht auf einem Ordner in meinem System, sondern auf meinem FTP-Server suchen möchte?


Ich versuchte es mit folgendem Funktionsaufruf:

File fileDir = new File("192.168.0.1/directory/");
String newestFile = getNewestFile(fileDir);

Allerdings erhalte ich immer eine NullPointerException, wenn die for-each - Schleife innerhalb der Funktion betreten werden soll. Daher gehe ich einfach mal davon aus, dass im Funktionsaufruf der Ordner auf dem FTP-Server nicht richtig übergeben wird.
Zu Testzwecken habe ich es auch mal mit einem lokalen Ordner versucht - da klappte alles.

Ich hoffe, ihr könnt mir helfen und bedanke mich im Voraus.


----------



## SlaterB (3. Sep 2007)

ich persönlich weiß nicht, wie du mit Files auf einem entferten FTP-Server umgehen kannst/ sollst/ darfst,
da wäre wahrscheinlich ein neues Topic passend


----------

