Rekursiv muss dass laufen!

Status
Nicht offen für weitere Antworten.
J

JayJay

Gast
Ja Hallo ich habe ein problem mit einem programm an dem ich gerade arbeite. Das programm "watched" über änderungen in einem base folder, bsw: c:\TestFolder , und ich brauche es Rekursiv.
Rekursiv im sinne, dass wenn eine File, isFile() es dass machen soll was es schon macht, dass passt, nur wenn es eine subdirectory innerhalb der base directory findet, also isDirectory(), dann soll es rekursiv in diesem folder wieder die run methode laufen lassen!!!

Mir ist schon klar wie es rekursiv laufen sollte, indem die run() methode innerhalb der eigenen methode aufgerufen wird.

Ich habe vieles versucht nur hab ich noch so einige fehler im programm. Hier ist der code:


public DirWatcher(String path, String filter) throws FileNotFoundException {
this.path = path;
dfw = new DirFilterWatcher(filter);
filesArray = new File(path).listFiles(dfw);
validateDirectory(new File(path));

// transfer to the hashmap be used a reference and keep the
// lastModfied value
for (int i = 0; i < filesArray.length; i++) {
dir.put(filesArray, new Long(filesArray.lastModified()));
}

}

protected abstract void onChange(File file, String action);

public final void run() {
HashSet<File> checkedFiles = new HashSet<File>();

// scanning the files and checking for modification/addition
for (int i = 0; i < filesArray.length; i++) {
Long current = (Long) dir.get(filesArray);

checkedFiles.add(filesArray);
if (current == null) {
// new file
dir.put(filesArray, new Long(filesArray.lastModified()));
onChange(filesArray, "new File\\Directory added");
} else if (current.longValue() != filesArray.lastModified()) {
// modified file ??!!! Distiguish between file and foldeer
dir.put(filesArray, new Long(filesArray.lastModified()));
onChange(filesArray, "File or Directory has been modified");
}

}

// now check for deleted files
Set ref = ((HashMap) dir.clone()).keySet();
ref.removeAll((Set) checkedFiles);
Iterator it = ref.iterator();
while (it.hasNext()) {
File deletedFile = (File) it.next();

dir.remove(deletedFile);
onChange(deletedFile, "deleted");
}
}



Ich bin die sache vielleicht etwas kompliziert angegangen mit den arrays+hashmap+hashset. Was hilfreich wäre ist wo und wie genau ich dieses rekursiv laufen lassen kann, da ich probleme habe mit den typ variablen um dies zu machen. Ich bekomme immer eine fehler meldung: "Cannot instantiate this method", wenn ich etwas versuche.

Danke im vorraus
 

Saxony

Top Contributor
Ähm kapsel mal deinen Code bitte in einem Code-Tag. Dann können wir den vielleicht auch lesen. ;)

bye Saxony
 
J

JayJay

Gast
Oh ok

Code:
public DirWatcher(String path, String filter) throws FileNotFoundException { 
this.path = path; 
dfw = new DirFilterWatcher(filter); 
filesArray = new File(path).listFiles(dfw); 
validateDirectory(new File(path)); 

// transfer to the hashmap be used a reference and keep the 
// lastModfied value 
for (int i = 0; i < filesArray.length; i++) { 
dir.put(filesArray[i], new Long(filesArray[i].lastModified())); 
} 

} 

protected abstract void onChange(File file, String action); 

public final void run() { 
HashSet<File> checkedFiles = new HashSet<File>(); 

// scanning the files and checking for modification/addition 
for (int i = 0; i < filesArray.length; i++) { 
Long current = (Long) dir.get(filesArray[i]); 

checkedFiles.add(filesArray[i]); 
if (current == null) { 
// new file 
dir.put(filesArray[i], new Long(filesArray[i].lastModified())); 
onChange(filesArray[i], "new File\\Directory added"); 
} else if (current.longValue() != filesArray[i].lastModified()) { 
// modified file ??!!! Distiguish between file and foldeer 
dir.put(filesArray[i], new Long(filesArray[i].lastModified())); 
onChange(filesArray[i], "File or Directory has been modified"); 
} 

} 

// now check for deleted files 
Set ref = ((HashMap) dir.clone()).keySet(); 
ref.removeAll((Set) checkedFiles); 
Iterator it = ref.iterator(); 
while (it.hasNext()) { 
File deletedFile = (File) it.next(); 

dir.remove(deletedFile); 
onChange(deletedFile, "deleted"); 
} 
} 
[\code]
 

mikachu

Top Contributor
Code:
public DirWatcher(String path, String filter) throws FileNotFoundException
{
	this.path = path;
	dfw = new DirFilterWatcher(filter);
	filesArray = new File(path).listFiles(dfw);
	validateDirectory(new File(path));

//		 transfer to the hashmap be used a reference and keep the
//		 lastModfied value
	for (int i = 0; i < filesArray.length; i++)
	{
		dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
	}
}

protected abstract void onChange(File file, String action);

public final void run()
{
	HashSet<File> checkedFiles = new HashSet<File>();

//		 scanning the files and checking for modification/addition
	for (int i = 0; i < filesArray.length; i++)
	{
		Long current = (Long) dir.get(filesArray[i]);
	
		checkedFiles.add(filesArray[i]);
		if (current == null)
		{
//		 new file
			dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
			onChange(filesArray[i], "new File\\Directory added");
		}
		else if (current.longValue() != filesArray[i].lastModified())
		{
//		 modified file ??!!! Distiguish between file and foldeer
			dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
			onChange(filesArray[i], "File or Directory has been modified");
		}
	}

//		 now check for deleted files
	Set ref = ((HashMap) dir.clone()).keySet();
	ref.removeAll((Set) checkedFiles);
	Iterator it = ref.iterator();
	while (it.hasNext())
	{
		File deletedFile = (File) it.next();
	
		dir.remove(deletedFile);
		onChange(deletedFile, "deleted");
	}
}
sein code in leserlicherer form -> #not modified#
 

Saxony

Top Contributor
Hiho,

nunja ohne jetzt direkten Bezug zu deinem Code zu nehmen.
Im allgemeinen geht das wie hier beschrieben.

Falls der Link irgend wann mal nicht mehr gehen sollte:

Code:
//author: Marco Schmidt

import java.io.File;

public class scantree {
    public static void main(String[] args) {
        // Programm muss einen Verzeichnisnamen als Parameter haben
        File dir = new File(args[0]);
        scan(dir);
    }

    public static void scan(File dir) {
        // Liste aller Dateien und Unterverzeichnisse holen
        String[] entries = dir.list();
        if (entries == null || entries.length < 1) {
            return;
        }
        for (int i = 0; i < entries.length; i++) {
            File entry = new File(dir, entries[i]);
            if (entry.isDirectory()) {
                scan(entry); // rekursiv ins Unterverzeichnis verzweigen
            } else {
                // entry ist eine Datei
                System.out.println(entry);
            }
        }
    }
}

Übrigens: 5. Eintrag bei google / Suchbegriff: java rekursiv verzeichnisse lesen
:D

Dabei findet man auch eine Lösung aus dem Buch Java ist auch eine Insel, welche aber keinen expliziten Rekursionsaufruf durchführt sondern mit Stack und List arbeitet.

:)

bye Saxony
 
J

JayJay

Gast
Ja die Logik passt, nur hatte ich schon ne methode die mir den Inhalt der subdirectories auflistet.

Code:
public static List recursiveDir(File startDir) throws FileNotFoundException {
	
		validateDirectory(startDir);//puts in path
		List result = new ArrayList();

		File[] filesAndDirs = startDir.listFiles();
		List filesDirs = Arrays.asList(filesAndDirs);
		Iterator filesIter = filesDirs.iterator();
		File file = null;
		while (filesIter.hasNext()) {
			file = (File) filesIter.next();
			result.add(file); // always add, even if directory
			
			if (file.isDirectory()) { //better
				List deeperList = recursiveDir(file);
				result.addAll(deeperList);
		}
		}
		Collections.sort(result);
		return result;
		
		}

Das eigentliche problem ist die run() methode rekursiv aufzurufen, dass die jeweiligen subdirectories dann überwacht und mir die datai änderung innerhalb aller directories mitteilt.
Das programm ist ein überwachungsprogramm für änderungen innerhalb einer main Directory. Der andere teil ist das nachdem änderungen erkannt wurden dass eine automatische email an die jeweiligen personen verschickt werden per JavaMail natürlich. Den teil hab ich schon, nur brauch ich eine kombination der run() methode die ich oben geposted hab die mit der logik von ScanTree läuft.
 

Saxony

Top Contributor
Hiho,

so naja ich hab mal was gebastelt.

Folgender Code durchsucht permanent ein Verzeichnis. Sollten sich Dateien geändert haben, wird dies abgefangen und die veränderte Datei angezeigt. An dieser Stelle kannste dann deine Mailfunktion rein tun.

Code:
import java.io.File;
import java.util.Iterator;
import java.util.Vector;

public class Dir {

	private Vector<MyFile> currentFiles;
	private Vector<MyFile> oldFiles;

	public static void main(String[] args) {

		Dir dir = new Dir();
		dir.run(new File("c:\\test\\"));
	}

	public Dir() {

		this.currentFiles = new Vector<MyFile>();
		this.oldFiles = new Vector<MyFile>();
	}

	public void run(File aFile) {

		while (true) {

			this.oldFiles = (Vector<MyFile>)(this.currentFiles.clone());
			this.currentFiles.removeAllElements();
			
			try {
				Thread.sleep(1000);
			} catch (Exception ex) {}
			
			this.getCurrentFiles(aFile);			
			this.checkModified();		
		}
	}

	public void getCurrentFiles(File aFile) {

		String[] entries = aFile.list();

		if (entries == null || entries.length < 1) {
			return;
		}

		for (int i = 0; i < entries.length; i++) {
			File entry = new File(aFile, entries[i]);
			if (entry.isDirectory()) {

				getCurrentFiles(entry);
			} else {

				this.currentFiles.add(new MyFile(entry.getAbsolutePath(), entry.lastModified()));
			}
		}
	}

	public void checkModified() {

		Iterator<MyFile> iter = this.currentFiles.iterator();
		MyFile current;
		MyFile old;
		while (iter.hasNext()) {

			current = iter.next();
			old = this.getOldFile(current.getPath());

			if (old != null) {

				System.out.println(current.getLastModified());
				System.out.println(old.getLastModified());
				
				if (current.getLastModified() != old.getLastModified()) {

					System.out.println("jetzt ne mail "
							+ current.getPath());
				}
			}
		}
	}

	public MyFile getOldFile(String aPath) {

		MyFile erg = null;

		Iterator<MyFile> iter = this.oldFiles.iterator();
		MyFile old;

		while (iter.hasNext()) {

			old = iter.next();

			if (old.getPath().equals(aPath))
				return old;
		}

		return erg;
	}
}

und noch die MyFile

Code:
public class MyFile {

	private long modified;
	private String path;

	public MyFile(String aPath, long aModified) {

		this.path = aPath;
		this.modified = aModified;
	}

	public long getLastModified() {

		return this.modified;
	}
	
	public String getPath() {

		return this.path;
	}
}

Is erstma ne schnelle Lösung, die man sicher noch überarbeiten könnte/sollte.

Analog zu checkModified kannste dann halt auch die Sache mit gelöschten Dateien machen.

bye Saxony
 
J

JayJay

Gast
Ja wunderbar, dass mit der delete hab ich auch hinbekommen. :)

Noch eine letzte frage hab ich noch.
Wenn jetzt neue dateien hinzugefügt werden in die Verzeichnisse,
wie würde der if clause aussehen.
Ich weiss das es recht simple iss, aber klappt bei mir net so ganz.

Vielen Dank für alles
 
J

JayJay

Gast
Also mein problem ist dass bei der methode

Code:
public void checkModified() {
		Iterator<MyFile> iter = this.currentFiles.iterator();
		MyFile current;
		MyFile old;
		
		while (iter.hasNext()) {

			current = iter.next();
			old = this.getOldFile(current.getPath());
			
			if (old != null) {
				
				// System.out.println(current.getLastModified());
				// System.out.println(old.getLastModified());
		
				if (current.getLastModified() == null) { //hier liegt das problem
// das geht nicht weil: "The operator == is undefined for the argument type(s) long, null" 
					System.out.println("New File has been added: "+current.getPath() + " on: " + new Date());
				}
				if (current.getLastModified() != old.getLastModified()) {

					System.out.println("The File: " + current.getPath()
							+ " has been changed on: " + new Date());
					// System.out.println("jetzt ne mail " + current.getPath());
				}
			}
		}
	}

Weiss jemand einen weg vorbei oder besser?
 
G

Gast

Gast
primitive Typen sind "keine" objekte

also

int = 0
long = 10

also nix null

dann auch
if( myInt == 0)
 
J

JayJay

Gast
Ja klar war doch so einfach :)

Also dieser Thread ist fertig wie kann ich dass denn abticken.

Vielen dank Herr Gast

Aso die Lösung falls die jemand will:
Naja man muss nur eine else clause einbauen unzw. im gegensatz zu: "if (old != null) { "
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4
M Fibonacci-Linear und Rekursiv Java Basics - Anfänger-Themen 14
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
D preOrder, inOrder, postOrder rekursiv zusammensetzen aus String Java Basics - Anfänger-Themen 1
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
J eulersche rekursiv berechnen Java Basics - Anfänger-Themen 6
J Suchbaumeigenschaft rekursiv programmieren Java Basics - Anfänger-Themen 3
T Rekursiv Vokale zählen Java Basics - Anfänger-Themen 19
G Bestimmte Ebene eines Baumes rekursiv ausgeben Java Basics - Anfänger-Themen 49
F Sortieralgorithmus von rekursiv auf iterativ? Java Basics - Anfänger-Themen 21
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
S Stringlänge Rekursiv ermitteln Java Basics - Anfänger-Themen 2
dognose Verzeichnis rekursiv auslesen / beschränkte Apis. Java Basics - Anfänger-Themen 6
0 a hoch b rekursiv - wie stoppen? Java Basics - Anfänger-Themen 3
T Ordnerstrucktur rekursiv auslesen Java Basics - Anfänger-Themen 9
G Rekursiv die größte Zahl eines Arrays Java Basics - Anfänger-Themen 6
G Rekursiv Array Elemente quadrieren Java Basics - Anfänger-Themen 2
N Fibo Zahlen:iterativ,rekursiv Anzahl der Additionen zählen Java Basics - Anfänger-Themen 2
P Permutationen einer Tour rekursiv Java Basics - Anfänger-Themen 4
G Baumstruktur rekursiv durchlaufen Java Basics - Anfänger-Themen 2
B Kürzesten Weg zwischen mehreren Punkten finden (rekursiv) Java Basics - Anfänger-Themen 5
L Kombinationen einer Menge rekursiv berechnen Java Basics - Anfänger-Themen 11
J BinBaum rekursiv ausgeben Java Basics - Anfänger-Themen 9
W Rekursiv Zeichen einfügen Java Basics - Anfänger-Themen 6
M Verzeichnisse rekursiv durchlaufen und dann RegEx Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben