Ordner samt Dateien kopieren

Timpa1971

Mitglied
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...:
Java:
	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.
 
@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
 
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 SimpleFileVisitorangeben, 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.
 
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:
Java:
	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
 
Zuletzt bearbeitet:
Kopieren...

Ich würd jetzt rein spontan sagen, dass du die gesamte Datei ungefähr so einliest
Code:
//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
 
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
 
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ß
 
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"
 
Zuletzt bearbeitet:
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😉

Java:
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));
	}
}
 

Zurück
Oben