Replizieren von Unterverzeichnissen

Status
Nicht offen für weitere Antworten.

Eminent

Bekanntes Mitglied
Hi,

ich muss euch mal wieder mit einem Problem belästigen.

Zuerstmal der Ist-Zustand :)

Dank eurer Hilfe habe ich jetzt bereits ein Replizierprogramm geschrieben, dass zwei beliebige Verzeichnisse miteinander vergleicht und ggf. (je nach Modus) die Dateien der beiden Verzeichnisse abgleicht bzw. die beiden Verzeichnisse sozusagen synchronisiert. Das ganze funktioniert so weit wunderbar, nur leider nur mit Dateien. Bei Unterordnern funktioniert das ganz so nicht, deshalb lasse ich diese im Moment außen vor.

Soll-Zustand:

Für die beiden ausgewählten Verzeichnisse sollen auch eventuell enthaltene Unterverzeichnisse mit in die Replizierung eingeschlossen werden.

Problem:

Wenn ich versuche einen Ordner so zu kopieren wie eine Datei bekomme ich eine FileNotFoundException mit der meldung Zugriff verweigert.

Lösung:

Hier ist mein Problem! :D Rein theoreisch sollte es ja so gehen, dass ich einfach bei der Liste der zu kopierenden File-Objekte schaue ob es sich um einen Ordner handelt und wenn das der Fall ist muss ich die ganze Routine zur Replizierung nochmal mit anderen Pfadangaben anstoßen.
Wo ich jetzt aber nicht klar komme ist, wenn ich im Verzeichnis 1 einen Unterordner habe der im Verzeichnis 2 auch enthalten ist kann ich einfach replizieren. Ist der Unterordner aber im Verzeichnis 2 nicht enthalten muss ich ihn ja erst erstellen, oder? Das alles ist für mich irgendwie alles ziemlich verdreht (weiß auch nicht warum). Ich finde auch nicht so recht nen vernünftigen Ansatz bei dem ich dann sage so müsste es gehen, weil ich dann immer wieder auf irgendein Probem stoße, dass ich so nicht richtig bedachat hatte.

Ich hoffe ich hab einigermaßen verständlich erklärt was ich will und was ich nicht hin bekomme. Wenn ihr noch Fragen habt fragt einfach! :) Bzw. wenn ihr Code braucht sagt mir einfach von welchen Stellen ungefähr oder so.

Danke jetzt schon vielmals für eure Hilfe.
 
L

Leroy42

Gast
Dein rekursiver Ansatz ist schon vollkommen richtig.
Eminent hat gesagt.:
Wo ich jetzt aber nicht klar komme ist, wenn ich im Verzeichnis 1 einen Unterordner habe der im Verzeichnis 2 auch enthalten ist kann ich einfach replizieren.
Richtig!
Eminent hat gesagt.:
Ist der Unterordner aber im Verzeichnis 2 nicht enthalten muss ich ihn ja erst erstellen, oder? Das alles ist für mich irgendwie alles ziemlich verdreht (weiß auch nicht warum).

Ich sehe das Problem nicht. Was ist denn wenn der entsprechende Unterordner zwar
im 2. Verzeichnis enthalten aber leer ist? Nach deiner ersten Aussage funktioniert
dann ja deine Repliziermethode. Falls also das Unterverzeichnis in einem der beiden Verzeichnisse
fehlt, erstellst du es eben und rufst danach deine Methode mit den beiden Unterverzeichnissen auf.
 

Eminent

Bekanntes Mitglied
Leroy42 hat gesagt.:
Dein rekursiver Ansatz ist schon vollkommen richtig.
Eminent hat gesagt.:
Wo ich jetzt aber nicht klar komme ist, wenn ich im Verzeichnis 1 einen Unterordner habe der im Verzeichnis 2 auch enthalten ist kann ich einfach replizieren.
Richtig!
Eminent hat gesagt.:
Ist der Unterordner aber im Verzeichnis 2 nicht enthalten muss ich ihn ja erst erstellen, oder? Das alles ist für mich irgendwie alles ziemlich verdreht (weiß auch nicht warum).

Ich sehe das Problem nicht. Was ist denn wenn der entsprechende Unterordner zwar
im 2. Verzeichnis enthalten aber leer ist? Nach deiner ersten Aussage funktioniert
dann ja deine Repliziermethode. Falls also das Unterverzeichnis in einem der beiden Verzeichnisse
fehlt, erstellst du es eben und rufst danach deine Methode mit den beiden Unterverzeichnissen auf.

Guten Morgen,

entschuldige, dass ich mich jetzt erst melde, aber ich war das Wochenende leider verhindert.

So wie du das sagst hatte ich mir das ganze schon auch vorgestellt, nur komme ich da insgesamt mit der Logik nicht so ganz klar. So lange es immer nur wenige Ordner sind und die Struktor nicht tiefer geht kriege ich das ganze rein theoretisch (bis jetzt) auch einigermaßen hin. Nur hab ich die Probleme, wenn ich mehrere Unterordner hab und dann in den einzelnen Unterordnern noch weitere Unterordner. Muss ich dann vor den eigentlichen Replizierungen immer erst alle Pfade durchsuchen und ggf. enthaltene Unterverzeichnisse irgendwie speichern? So wie ich es bis jetzt verstehe müsste ich ja beim Starten der Anwendung schauen welche Unterverzeichnisse es gibt und mir diese dann merken. Dann kann ich für jedes enthaltene Unterverzeichniss die "normale" Dateireplizierung starten.

Ist das jetzt vom logischen Ansatz her so richtig, oder bin ich da auf dem Holzweg?

Gruß
Eminent
 

byte

Top Contributor
Hm, also Du musst Dir IMO keine Unterverzeichnisse merken. Du schreibst Dir eine Methode, der Du ein Verzeichnis übergibst, dass repliziert werden soll. Die Methode holt sich alle Dateien und Verzeichnisse des Ordners und arbeitet sie ab. Wenn es sich um eine Datei handelt, dann kopierst Du sie einfach. Wenn es sich um ein Verzeichnis handelt, erzeugst Du das Verzeichnis in Deinem Zielordner und rufst die Methode rekursiv auf mit dem Unterverzeichnis als Argument. Den Rest übernimmt die Rekursion.
 

Eminent

Bekanntes Mitglied
byto hat gesagt.:
Hm, also Du musst Dir IMO keine Unterverzeichnisse merken. Du schreibst Dir eine Methode, der Du ein Verzeichnis übergibst, dass repliziert werden soll. Die Methode holt sich alle Dateien und Verzeichnisse des Ordners und arbeitet sie ab. Wenn es sich um eine Datei handelt, dann kopierst Du sie einfach. Wenn es sich um ein Verzeichnis handelt, erzeugst Du das Verzeichnis in Deinem Zielordner und rufst die Methode rekursiv auf mit dem Unterverzeichnis als Argument. Den Rest übernimmt die Rekursion.

DANKE ... mit dem Ansatz hat es jetzt funktioniert und das ganze 100 mal einfacher als in meinem Lösungsansatz mit dem Zwischenspeichern der einzelnen Unterverzeichnisse (der Code hat sich dadurch drastisch verkürzt :D ). :toll:

[schild=1 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Applaus[/schild]
 
L

Leroy42

Gast
Ahh ja!.

Da haben wir wieder einen von der Eleganz und Mächtigkeit der Rekusion überzeugt :D

Und Jetzt:

"Geh hinaus in die Welt und verkünde den Glauben an die Rekursion jedem der
es hören will (oder auch nicht)
"
:cool:
 

Eminent

Bekanntes Mitglied
Leroy42 hat gesagt.:
Ahh ja!.

Da haben wir wieder einen von der Eleganz und Mächtigkeit der Rekusion überzeugt :D

Und Jetzt:

"Geh hinaus in die Welt und verkünde den Glauben an die Rekursion jedem der
es hören will (oder auch nicht)
"
:cool:

Da habt ihr mich allerdings überzeugt! :D

Jetzt mal nur noch was anderes, wie sehe ich, dass die Rekursion beendet ist, spricht alle Unterordner und Dateiein fertig repliziert sind?

So gesehen hab ich doch keine direkte Kontrolle ob die Methode sich jetzt nochmal aufruft oder das eben nicht mehr macht. (Würde dem Anwender gern eine Meldung geben, dass die Replizierung jetzt abgeschlossen ist.
 

Ilja

Bekanntes Mitglied
sobald der erste aufruf (root) durchgelaufen ist, ist auch die gesamte rekursion abgeschlossen!

d.h. hinter der stelle, wo du das erste mal die rekursive funktion aufrufst, kannst du direkt die ausgaben "Fertig" machen.
 

Eminent

Bekanntes Mitglied
Ilja hat gesagt.:
sobald der erste aufruf (root) durchgelaufen ist, ist auch die gesamte rekursion abgeschlossen!

d.h. hinter der stelle, wo du das erste mal die rekursive funktion aufrufst, kannst du direkt die ausgaben "Fertig" machen.

Oh, so einfach geht das? :oops: Na dann herzlichen Dank!!!!
 
D

druFFF

Gast
hi,

ich hab ein ähnliches problem. ich will von einem gegeben verzeichnis (incl. aller unterverzeichnisse) alle *.jpg finden.
mit der list()-funktion kann ich mir den inhalt des verzeichnisses holen, allerdings sind dann dateien und verzeichnisse gleichgestellt. wie kann ich denn herausfinden, ob ein eintrag ein verzeichnis ist oder eine datei?

gruß druFFF
 
G

Guest

Gast
Code:
import java.io.*;

class FileFilter implements FilenameFilter
{
  public boolean accept( File f, String s )
  {
    return s.toLowerCase().endsWith(".java");
  }
}

public class db {
  public static void findFiles (File path){		// gibt alle Dateien aus, die zum Filter passen
	  String files[] = new File( System.getProperty(path.getAbsolutePath() ) ).list( new FileFilter() );		// aus allen Objekten des gegebenen Pfads wird ein Array mit Dateien angelegt, die zum Filter passen

	  for ( int i = 0; i < files.length; i++ )		//Ausgabe
	    System.out.println( files[i] );
  }
  
  public static File[] findPaths (String path){				// findet alle Unterverzeichnisse (rekursiv)
    File[] paths = null;									// Array für die Verzeichnisse des angebenen Pfads
	File objects[] = new File(System.getProperty(path)).listFiles();		// Array von allen Objekten (Dateien+Verzeichnisse) im übergebenen Pfad
	
    if (objects != null){								// Suchen von Verzeichnissen in "objects"
      int j=0;
	  for ( int i = 0; i < objects.length; i++ )
  	    if (objects[i].isDirectory()){
	      paths[j++]=objects[i];
		  findPaths(objects[i].getAbsolutePath());
	    }
    }
	return paths;  
  }
  
  public static void main( String args[] )
  {
	File[] paths;								// Array, in dem alle Unterverzeichnisse gespeichert werden 
	
	paths=findPaths("user.dir");				// Wurzelpfad fehlt noch				
	
	if (paths != null){							// zum Finden von allen Dateien in jedem Unterverzeichnis 
	  for (int i=0; i<paths.length; i++){		
		findFiles(paths[i]);
	  }
	}
  }
}

soweit hab ich's jetzt, aber ich habe in zeile 27 und 38 eine nullpointerexception, warum?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben