# Ordner samt Dateien kopieren



## Timpa1971 (22. Jan 2014)

Hallo,
Ich habe mal eine Frage, und zwar versuche ich seit geraumer Zeit einen ordner von A nach B zu kopieren, wobei die Dateien samt Inhalt mit kopiert werden.
Ich habe einen kleinen Anfang, das ist aber nicht viel...:

```
public static void Kopieren(File src, File dest) {
		if(src != dest) {
			if(src.exists()) {
				if(dest.exists()) {
					dest.delete();
					//Dateien erstellen
				} else {
					//Dateien erstellen
				}
			}
		}
	}
```
Ich hoffe ihr könnt mir helfen und freue mich auf Antworten.

MfG, Timpa

PS: Falls es wichtig ist: Ich programmiere mit Eclpise.


----------



## eMmiE (22. Jan 2014)

@PS: Nö eigentlich nicht

@Thema: Du musst auf jeden Fall ein Programm schreiben, das rekursiv erstmal alle Ordner, die da drin stecken auflistet

Die Ordner speicherst du dann als Files in ner ArrayList ab. (komplette Pfade)
Dann machst du bei der neuen Addresse für jeden der Pfade .mkdir()

Dann guckst du bei den alten Addressen der Pfade jeweils nach, wieviele und welche nicht-Ordner Pfade enthalten sind (-> Dateien), die du dann jeweils, am Besten mit einer Datei-kopieren Methode (von,zu) an den neuen Ort kopierst.
Dazu nimmst du am Besten den Pfad von dem Ordner aus (aus dem du kopierst) zu der Datei, und kopierst zum Pfad: Ordner (zu dem du kopieren willst) + restlicherPfad

Hoffe ich konnte helfen

Gruß eMmiE


----------



## turtle (22. Jan 2014)

File würde ich an deiner Stelle nicht mehr verwenden.

Denn in Java 7 dafür gibt es nun das neue Interface Path und die Klasse Files.

In Files gibt es die Methode *walkFileTree *mit der du einen Path traversieren kannst.

Dabei kannst du eine *SimpleFileVisitor*angeben, den du schreiben musst. 

Darin gibt es die Methode *visitFile*, in der du eine Datei kopieren kannst und in *preVisitDirectory *kannst du ein Directory erzeugen.


----------



## Timpa1971 (22. Jan 2014)

Hallo,

@turtle: Ich verwende leider immoment nur java 6. Auserdem kann ich mich nicht mit Java 7 aus, werde das aber demnächst anschauen.
@eMmie:
Wie kopiere ich? das ist ja eben mein problem... Sorry ichbin recht neu und habe bisher nur Bukkit programmiert... Mit 'richtigen' Java programmier ich erst jetzt..
Mein bisheriger Code:

```
private static ArrayList<String> files = new ArrayList<String>();
	public static void Kopieren(File src, File dest) {
		if(src != dest) {
			if(src.exists()) {
				try {
					dest.delete();
				} catch(Throwable throwable1) {
					throw throwable1;
				}
				String[] files1 = src.list();
				for(String file : files1) {
					if(file != null) {
						if(files.size() > files1.length) {
							if(!files.contains(file)) {
								files.add(file);
							}
						} else if(files.size() == files1.length) {
							File f = (File) files.clone();
							f.mkdir();
							//Dateien erstellen
						}
					}
				}
			}
		}
	}
```
MfG, Timpa


----------



## eMmiE (23. Jan 2014)

Kopieren...

Ich würd jetzt rein spontan sagen, dass du die gesamte Datei ungefähr so einliest

```
//liest ein
File file = src;
char[] buffer = new char[(int)(file.length())];
try {
  FileReader fr = new FileReader(file);
  fr.read(buffer);
  fr.close();
  FileWriter fw = new FileWriter(dest);
  fw.write(buffer);
  fw.close();
} catch (IOException io) {}
```

Muss dazu sagen, dass ich das noch nie so direkt hintereinander gemacht habe...
Man sollt evtl fortgeschrittenere Klassen nehmen (BufferedReader,...) aber das ist soweiso nur ne idee


Gruß eMmiE


----------



## Timpa1971 (23. Jan 2014)

Ich krieg das nicht hin.. Ich verstehe auserdem nicht mehr viel.. Mit BufferdReader brüchte ich eine andere src.. auserdem klappt da nichts


----------



## eMmiE (24. Jan 2014)

Du hast nicht zufällig schonmal ne Datei eingelesen und bearbeitet?
-> googlen hilft
mach dich am Besten selbst schlau, mein Ansatz ist der Einfachste, der mir jetzt grad so eingefallen ist, bei dem einfach eine Datei in einen Buffer eingelesen wird und dann dieser Buffer wieder an anderer Ort und Stelle geschrieben wird.

Wo liegen denn deine Probleme?

Gruß eMmiE


----------



## Lonsdaleit (24. Jan 2014)

Es gibt für File die Methode "renameTo()".

Diese Methode kann auch dafür benutzt werden um Files zu verschieben.

Ansonsten den Ansatz wählen der schon vorgeschlagen wurde.

Rekursiv alle Verzeichnisse und Dateien des Ordners abarbeiten und "verschieben".

Gruß


----------



## Timpa1971 (24. Jan 2014)

Ok, entschuldigung ich habe meinen Fehler. Das Problem ist das ich nicht wies wie ich den Pfad angebe. Ich glaube das ../ stimmt nicht.
Ich brauche diesen Pfad:
Desktop
-Test
--Ordner1
---Die Datei
--Ordner2
---src
--dest

src und dest exestieren. Meine src: "../Ordner2/src" und dest: "../dest"


----------



## eMmiE (26. Jan 2014)

Und? Funktionierts?


----------



## Timpa1971 (26. Jan 2014)

Nein, der Pfad scheint nicht zu stimmen. Jedenfalsl bricht er dort ab....


----------



## turtle (26. Jan 2014)

> Ich verwende leider immoment nur java 6. Auserdem kann ich mich nicht mit Java 7 aus, werde das aber demnächst anschauen


Es scheint sich ja etwas getan zu haben in diesem Thread...

Aber ich poste mal meine Java-7 Lösung für Interessierte trotzdem, denn es gibt für Java-6 keine Updates mehr und wird nicht mehr gepflegt und daher ein Grund sich Java-7 anzuschauen, zumal Java-8 steht bereits vor der Tür. Java-7 wird wohl März 2015 ebenfalls den Gang alles Irdischen nehmen und das ist auch nicht mehr soo lange hin


```
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;

public class CopyDirVisitor extends SimpleFileVisitor<Path> {
	private Path fromPath;
	private Path toPath;
	private StandardCopyOption copyOption = StandardCopyOption.REPLACE_EXISTING;

	CopyDirVisitor(Path fromPath, Path toPath) {
		this.fromPath = fromPath;
		this.toPath = toPath;
	}

	@Override
	public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
		Path targetPath = toPath.resolve(fromPath.relativize(dir));
		if (!Files.exists(targetPath)) {
			Files.createDirectory(targetPath);
		}
		return FileVisitResult.CONTINUE;
	}

	@Override
	public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
		System.out.println(file);
		Files.copy(file, toPath.resolve(fromPath.relativize(file)), copyOption);
		return FileVisitResult.CONTINUE;
	}

	public static void main(String[] args) throws IOException {
		Path startingDir = FileSystems.getDefault().getPath("D:/turtle");
		Path destDir = FileSystems.getDefault().getPath("D:/turtleKopie");

		Files.walkFileTree(startingDir, new CopyDirVisitor(startingDir, destDir));
	}
}
```


----------

