# Ordnerstruktur anlegen



## H2SO4 (8. Jul 2010)

Hallo!

Eine Methode soll eine bestimmte Ordnerstruktur erstellen. Diese kann sich durchaus auch mal ändern.

Ich braue also eine Möglichkeit diese zu speichern. Was bietet sich dafür wie an?

order
-sub1
-sub2
--sub21
--sub22
-sub3
-sub4
--sub41
---sub411

Wie geh ich dann vor wenn ich die Struktur anlegen möchte?


Danke für eure Tipps/vorschläge/etc.


----------



## Ruzmanz (8. Jul 2010)

Unter folgenden Link wird das ziemlich gut beschrieben, wie es sich darstellen/abspeichern lässt: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.19 Bäume (JTree)


----------



## hemeroc (8. Jul 2010)

Erstellen kannst du die Verzeichnisse dann hiermit:File (Java 2 Platform SE v1.4.2)
LG Hemeroc


----------



## H2SO4 (8. Jul 2010)

Hallo!

Ist JTree wirklich das richtige?

Ich will ja nicht Ordner einlesen und dann darstellen. Sondern ich möchte eine Ordnerstruktur programmintern vorhalten und dann mit einer Methode anlegen, so dass die Ordner wirklich existieren. Dazu würde ich ungern gleich so eine "große" Klasse JTree verwenden.

Wenn das doch das sinnvollste ist, könnte es mir vll einer am beispiel erklären? NUr ganz einfach.

Danke!


----------



## Ruzmanz (8. Jul 2010)

Es geht weniger um die Verwendung von JTree sondern dessen umsetzung. Du kannst eine Orderstrucktur am schönsten in Form eines Baumes mit mehreren zweigen darstellen:


```
| - Datei 1
       |- Ordner 1 | - Datei 2
       |           | - Datei 3
       |
Root |- Ordner 2 | - Ordner 3 | - Datei 4
       | 
       |           | - Datei 5
       |- Ordner 4 | - Datei 6
                   | - Datei 7
```

Zitat aus dem Link:


> Das Model ist sehr einfach und muss lediglich die Aussage treffen, ob das Element ein Blatt oder eine Wurzel darstellt und wo ein Element in der Baumverästelung liegt.


----------



## Gelöschtes Mitglied 5909 (8. Jul 2010)

er will es aber nicht darstellen, sondern erstellen. 

java.io.File#mkdir() 

java.io.File#mkdirs()


----------



## Ruzmanz (9. Jul 2010)

Er will *intern* eine Ordnerstruktur abspeichern und das realisiert man am besten mit einem Baum. Und ein Baum repräsentiert bzw. stellt bestimmte Informationen dar. Das hat überhaupt nichts damit zu tun, ob er die nun ausgeben möchte oder im Textformat irgendwo in seiner JRE rumgeistert. So habe ich ihn zumindest verstanden.


----------



## Gastredner (9. Jul 2010)

Vielleicht könnte man auch eine XML-Datei zum Speichern der Struktur nehmen (Programmintern könnte man das Dokument dan entsprechend darstellen, z. B. als JDOM-Document). Dann muss man nur noch über jedes Element des Baumes iterieren und die entsprechenden Ordner erstellen:
[XML]<dirs baseDir="/Pfad/zu/dem/Basisverzeichnis/">
	<dir name="1">
		<dir name="1.1" />
		<dir name="1.2">
			<dir name="1.2.1" />
		</dir>
		<dir name="1.3" />
	</dir>
	<dir name="2">
		<dir name="2.1" />
		<dir name="2.2" />
	</dir>
</dirs>[/XML]

```
import java.io.File;
import java.util.List;

import org.jdom.Element;

public class FileUtils {

	public static void makeDirs(Element root) {
		File baseDir = new File(root.getAttribute("baseDir").getValue());
		if (!baseDir.exists()) {
			baseDir.mkdir();
		} else {
			// Dieser Fall muss noch behandelt werden.
		}
		List<Element> dirs = root.getChildren("dir");
		for (Element dir: dirs) {
			_makeDirs(baseDir, dir);
		}
	}

	private static void _makeDirs(File parent, Element dir) {
		File file = new File(parent, dir.getAttribute("name").getValue());
		if (!file.exists()) {
			file.mkdir();
		} else {
			// Dieser Fall muss noch behandelt werden.
		}
		List<Element> children = dir.getChildren("dir");
		if (!children.isEmpty()) {
			for (Element child: children) {
				_makeDirs(file, child);
			}
		}
	}
}
```
Das ist jetzt nur schnell heruntergeschrieben und vermutlich nicht optimal, aber es sollte funktionieren.

EDIT: Korrigiert und getestet, das Erstellen funktioniert.


----------



## TJava (5. Apr 2011)

Vielleicht etwas spät aber wo wird denn die XML Datei ausgewählt?

MfG


----------



## TJava (5. Apr 2011)

So geht es !
In der Main muss jetzt nur noch ein Objekt erstellt und dieses muss dann die Methode Makedirs aufrufen.

MfG




```
package de.usu.foxtrot.framework;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

import org.jdom.*;

import org.jdom.output.XMLOutputter;

public class CreateAutoItWorkspace {

	
	public static void makeDirs() throws JDOMException, IOException {
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(new File("myXML.xml"));
		Element root = doc.getRootElement();
		
		File baseDir = new File(root.getAttribute("baseDir").getValue());
		if (!baseDir.exists()) {
			baseDir.mkdir();
		} else {
			// Dieser Fall muss noch behandelt werden.
		}
		List<Element> dirs = root.getChildren("dir");
		for (Element dir : dirs) {
			_makeDirs(baseDir, dir);
		}
	}

	private static void _makeDirs(File parent, Element dir) {
		File file = new File(parent, dir.getAttribute("name").getValue());
		if (!file.exists()) {
			file.mkdir();
		} else {
			// Dieser Fall muss noch behandelt werden.
		}
		List<Element> children = dir.getChildren("dir");
		if (!children.isEmpty()) {
			for (Element child : children) {
				_makeDirs(file, child);
			}
		}
	}

}
```


----------



## Gastredner (5. Apr 2011)

TJava hat gesagt.:


> In der Main muss jetzt nur noch ein Objekt erstellt und dieses muss dann die Methode Makedirs aufrufen.


Objekt erstellt werden? Von was? CreateAutoItWorkspace? Sicherlich nicht, die Methoden sind static und können einfach so aufgerufen werden.
Abgesehen davpn fände ich es sinnvoller, würdest du den nichtmodifizierten Code verwenden und die XML-Datei vor dem Aufruf von FileUtils.makeDir parsen - das gäbe dir die Möglichkeit, einen bereits bestehenden Parser wiederzuverwenden oder auch die Auswahl einer anderen XML-Datei via FileChoose/etc einzubauen, ohne dazu den Code der ehemaligen FileUtils-Klasse verändern zu müssen, was deren Wiederverwendungswert erhöht.


----------

