Datei anhand Datum identifizieren

epsodus

Mitglied
Hallo ich habe ein kleines Problem. In einem Verzeichnis liegen Dateien, diese Dateien können vom Vormonat sein. Bevor die neuen Dateien ins Verzeichnis kopiert werden, sollen die Dateien vom Vormont gelöscht werden. Die Dateinamen sind gleich und unterscheiden sich nur im Datum. Leider werden immer alle Dateien gelöscht, was mache ich falsch ?Anbei mal der Sourcecode.
Java:
/**
     * Löscht aus dem Auspack-Verzeichnis und aus dem Instituts-Zielverzeichnis
     * alle alten Dateien.
     * Alte Dateien sind alle aus dem letzten Monat.
     *
     */
    public void deleteOldKagFiles(){
      
        // Calendar kalenderHeute = Calendar.getInstance();
        // int aktuellerMonat = kalenderHeute.get(Calendar.MONTH); //es wird von 0 aus gezählt!
        Calendar dateidatum = Calendar.getInstance();
        Calendar referenzdatum = Calendar.getInstance();//an diesem Datum wird gemessen, wie alt eine Datei ist
      
        //morgen ein Monat zurück, Null Uhr
        referenzdatum.add(Calendar.MONTH, -1);
        referenzdatum.add(Calendar.DAY_OF_MONTH, 1);
        referenzdatum.set(Calendar.HOUR_OF_DAY,0);
        referenzdatum.set(Calendar.MINUTE,0);
        referenzdatum.set(Calendar.SECOND,0);
          
      
        int anzahlMandanten=0;
        String regexpression = "\\{kuerzel\\}";
        String t_institutPath =null;
        File curDir=null;
        File tmpUnpackDirectory=null;
        boolean result=false;
      
        LinkedList<File> allFiles = new LinkedList<File>();
        Iterator<File> fileIterator;
        File sourceFile;
        SimpleDateFormat aSimpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
        //SimpleDateFormat aSimpleDateFormat2 = new SimpleDateFormat("MMMMM");
      
        try {
            prgLog.info("Suche im Auspackverzeichnis alte Dateien.");
        } catch (Exception e) {
            System.err.println("Logging unmoeglich");
        }
      
        // lege temp. Auspackverzeichnis an, wenn es noch nicht existiert
        tmpUnpackDirectory = new File(propertyKagTmpUnpacking);
        if(!tmpUnpackDirectory.exists()){
            try {
                prgLog.info("temp. Verzeichnis anlegen:" +propertyKagTmpUnpacking);
            } catch (Exception e) {
                System.err.println("Logging unmoeglich");
            }
            result=tmpUnpackDirectory.mkdir();
            if(!result){
                try {
                    prgLog.error("Fehler beim anlegen des temp. Verzeichnis");
                    prgLog.info("Programm wird wegen Fehler beendet.");
                } catch (Exception e) {
                    System.err.println("Logging unmoeglich");
                }
              
                System.exit(-1);
            }
        }
        //----------------------------------------------------
        // Zuerst im Auspackverzeichnis löschen
        // Alle Dateien in Liste speichern
        //allFiles = (LinkedList)FileUtils.listFiles(tmpUnpackDirectory,    new WildcardFileFilter("*.*",IOCase.SYSTEM),null);
        allFiles = getFileList(tmpUnpackDirectory, new DateFileFilter(referenzdatum.getTimeInMillis(),DateFileFilter.OLDER));
      
        if(allFiles.size()>0){
            fileIterator = allFiles.iterator();
            while(fileIterator.hasNext()){
                sourceFile = (File)fileIterator.next();
                //dateidatum.setTimeInMillis(sourceFile.lastModified());
                // alte löschen
                //if(dateidatum.get(Calendar.MONTH)<aktuellerMonat){
                    try{
                        try {
                            prgLog.info("Lösche ["+sourceFile.getName()+"] Dateidatum:"+aSimpleDateFormat.format(dateidatum.getTime()));
                        } catch (Exception e) {
                            System.err.println("Logging unmoeglich");
                        }
                        myIOUtils.forceDelete(sourceFile);
                    }catch(IOException ioe){
                        try {
                            prgLog.warn("Fehler beim Löschen von ["+sourceFile.getName()+"] Dateidatum:"+ioe.getMessage());
                        } catch (Exception e) {
                            System.err.println("Logging unmoeglich");
                        }
                    }
                //}
            }//while
        }
        //----------------------------------------------------
        // Jetzt im Instituts-Zielverzeichnis löschen
        if(propertyKagInstitutDestinationUse){
            try {
                prgLog.info("Suche im Institutszielverzeichnis alte Dateien.");
            } catch (Exception e) {
                System.err.println("Logging unmoeglich");
            }
            // pfad zusammenbauen aus Mandanten
            anzahlMandanten=allMandanteninTar.size();
            for (int x=0;x<anzahlMandanten;x++){
                t_institutPath = propertyKagDestinationPath;
                t_institutPath = t_institutPath.replaceFirst(regexpression, allMandanteninTar.get(x).substring(0, 5));
                curDir=new File(t_institutPath);
                if(!curDir.exists()){
                    try {
                        prgLog.warn("Kag-Verzeichnis wird neu erstellt: "+t_institutPath);
                    } catch (Exception e) {
                        System.err.println("Logging unmoeglich");
                    }
                    result=curDir.mkdir();
                    if(!result){
                        try {
                            prgLog.warn("Fehler beim anlegen des Kag-Verzeichnis "+t_institutPath);
                            prgLog.warn("Mandant wird übersprungen.");
                        } catch (Exception e) {
                            System.err.println("Logging unmoeglich");
                        }
                      
                        continue;
                    }
                }
                //allFiles = (LinkedList)FileUtils.listFiles(curDir,    new WildcardFileFilter("*.*",IOCase.SYSTEM),null);
                allFiles = getFileList(curDir, new DateFileFilter(referenzdatum.getTimeInMillis(),DateFileFilter.OLDER));
                if(allFiles.size()>0){
                    fileIterator = allFiles.iterator();
                    while(fileIterator.hasNext()){
                        sourceFile = (File)fileIterator.next();
                        dateidatum.setTimeInMillis(sourceFile.lastModified());
                        //if(dateidatum.get(Calendar.MONTH)<aktuellerMonat){
                            try{
                                try {
                                    prgLog.info("Lösche ["+sourceFile.getName()+"] Dateidatum:"+aSimpleDateFormat.format(dateidatum.getTime()));
                                } catch (Exception e) {
                                    System.err.println("Logging unmoeglich");
                                }
                                myIOUtils.forceDelete(sourceFile);
                            }catch(IOException ioe){
                                try {
                                    prgLog.warn("Fehler beim Löschen von ["+sourceFile.getName()+"] Dateidatum:"+ioe.getMessage());
                                } catch (Exception e) {
                                    System.err.println("Logging unmoeglich");
                                }
                            }
                        //}
                    }//while
                }
            }
        }
    }

Dazu gehört noch :
Java:
import java.io.File;
import java.io.FileFilter;
import java.util.Date;


/**
* Filtert nur die Dateien heraus, die mit dem angegebenen Mandanten beginnen.
*
*/
public class DateFileFilter implements FileFilter {

    private long refdate=0;
    private int status=0;
   
    public static final int OLDER=1;
    public static final int NEWER=2;
    public static final int OLDER_OR_EQUALS=3;
    public static final int NEWER_OR_EQUALS=4;
    public static final int EQUALS=5;
   
   
    public DateFileFilter(Date refdate, int status){
        this.refdate=refdate.getTime();
        this.status=status;
    }
    public DateFileFilter(long refdate, int status){
        this.refdate=refdate;
        this.status=status;
    }
   
    public boolean accept(File aFile) {
        long filedate=aFile.lastModified();
        boolean result=true;
       
        if(aFile.isDirectory())
             result=false;
       
        switch (status){
        case OLDER:
            if(filedate<refdate) result=true;break;
        case NEWER:
            if(filedate>refdate) result=true;break;
        case NEWER_OR_EQUALS:
            if(filedate>=refdate) result=true;break;
        case OLDER_OR_EQUALS:
            if(filedate<=refdate) result=true;break;
        case EQUALS:
            if(filedate==refdate) result=true;break;
        }
        return result;
    }

}
 
Hi,
Ich hab den Code noch nicht so richtig durchesehen, aber nur mal so ein kleiner Tipp: Was machst du wenn kein Case in der Methde public boolean accept(File aFile) {...} zutrifft. Du gibst immer true zurück... hilft evt. noch eine default-Klausel für den fall das kein Case zutrifft...
und ändere den Wert von boolean result=true; --> boolean result=false;
Ansonsten gibt die Prüfmethode immer true zurück..
Du möchtest aber nur true, wenn einer der 5 Fälle zurifft...

Java:
    public boolean accept(File aFile) {
        long filedate=aFile.lastModified();
        boolean result=false;
 
        if(aFile.isDirectory())
             result=false;
 
        switch (status){
        case OLDER:
            if(filedate<refdate)
                result=true;
            break;
        case NEWER:
            if(filedate>refdate)
                result=true;
            break;
        case NEWER_OR_EQUALS:
            if(filedate>=refdate)
                result=true;
            break;
        case OLDER_OR_EQUALS:
            if(filedate<=refdate)
                result=true;
            break;
        case EQUALS:
            if(filedate==refdate)
                result=true;
            break;
        default:
            result = false;
            break;
        }
        return result;
    }

Und noch etwas: Da die switch-struktur nur für Dateien ist... Ändere doch:
Java:
if(aFile.isDirectory())
             result=false;
zu
Java:
if(aFile.isDirectory())
      return false;
Ansonsten wird für ein Verzeichnis die Swich-Struktur auch noch durchlaufen...
 
Zuletzt bearbeitet:
Hallo Knilch, vielen vielen Dank. Jetzt funktioniert es. Eine default-Klausel sollte ich noch einfügen.
Stelle gerade fest, dass der Calender noch immer von 0 zählt ( 0 = Januar ). Da muss ich noch eine Lösung finden. Nochmals ein riesen Dank. Ich wünsche Dir und Deiner Familie ein frohes Weihnachtsfest bzw. schöne Feiertage.
 
Danke für deine Antwort.
Schön, dass ich helfen konnte 🙂
Auch Dir und Deinen Angehörigen erholsame und schöne Festtage.
 

Zurück
Oben