# Kopieren und Einfügen



## DocR (24. Feb 2010)

Hallo, 

ich wollte mal fragen ob ich in meinem Quellcode gleichzeitig die Möglichkeit habe eine Datei zu kopieren und in einem andreren Ordner einzufügen.

Momentan habe ich die Datei nur ausgelesen.


```
import java.io.*;

public class CopyData {
	
	/**
	 * @param args
	 */
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
// auslesen des Ordners
		
	File dir = new File("C:/Users/Werner/Desktop/peter");
	
	File[] fileList = dir.listFiles();
	
	for(File f : fileList) {
	
	    System.out.println(f.getName());
	
	}
}

}
```


----------



## Atze (24. Feb 2010)

momentan lässt du dir nur die namen ausgeben 

klar kannst du sie kopieren, indem du in sie liest (inputstream) und das gelesene wieder schreibst (outputstream).


----------



## The_S (24. Feb 2010)

Am effektivsten und einfachsten gehts mit Java NIO. In diesem Kapitel: Java Blog Buch : D) Verzeichnisse auslesen, durchsuchen und bearbeiten findest du u. a. eine Methode 
	
	
	
	





```
public void copyFile(File file, File target)
```
, mit der du eine Datei in ein beliebiges Verzeichnis kopieren kannst.


----------



## DocR (26. Feb 2010)

Danke für die antworten. Ich habe jetzt das Programm dazu geschrieben nur werden die daten nicht übertragen, weiß eventuell jmd warum?


```
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;


public class copyDir
{
     public static void main( String args[] )
     { 
      copyDir copy = new copyDir();
      
} 
     public void copyDir(String datei2, File ziel2)
//     public void copyDir(String quellePath, String zielPath)
     { 
     
    		File quelle = new File("C:/Users/Werner/Desktop/peter");
    		File ziel = new File("C:/Users/Werner/Desktop/hans");
    		
    		File[] Datei = quelle.listFiles();
    		
    		/*
    		   * In diesem Objekt wird für jedes File der Zielpfad gespeichert. 1. Der
    		   * alte Zielpfad 2. Das systemspezifische Pfadtrennungszeichen 3. Der Name
    		   * des aktuellen Ordners/der aktuellen Datei
    		   */
    		  File newFile = null;
    		  ziel.mkdirs(); // Erstellt alle benötigten Ordner
    		  if (quelle != null) {
                  for (int i = 0; i < Datei.length; i++) {
                    newFile = new File(ziel, Datei[i].getName());
                    if (Datei[i].isDirectory()) {
                      copyDir(Datei[i].getName(), ziel);
                    }
                    else {
                      copyDir(Datei[i].getName(), ziel);
                    }
                  }
                }
    }
     
}
```


----------



## SlaterB (26. Feb 2010)

in Zeile 35 bis 40 hast du im if und else denselben Aufruf stehen?!
copyFile() fehlt bisher, mehr als Verzeichnisse anlegen passiert nicht, schau doch nochmal im Link nach


----------



## DocR (26. Feb 2010)

ja stimmt, so natürlich, aber ich bekomme immer einen Fehler bei "copyDir" in Zeile 37


```
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;


public class copyDir
{
     public static void main( String args[] )
     { 
      copyDir copy = new copyDir();
      
} 
     public void copyDir(String datei2, File ziel2)
//     public void copyDir(String quellePath, String zielPath)
     { 
     
    		File quelle = new File("C:/Users/Werner/Desktop/peter");
    		File ziel = new File("C:/Users/Werner/Desktop/hans");
    		
    		File[] Datei = quelle.listFiles();
    		
    		/*
    		   * In diesem Objekt wird für jedes File der Zielpfad gespeichert. 1. Der
    		   * alte Zielpfad 2. Das systemspezifische Pfadtrennungszeichen 3. Der Name
    		   * des aktuellen Ordners/der aktuellen Datei
    		   */
    		  File newFile = null;
    		  ziel.mkdirs(); // Erstellt alle benötigten Ordner
    		  if (quelle != null) {
                  for (int i = 0; i < Datei.length; i++) {
                    newFile = new File(ziel, Datei[i].getName());
                    
                    if (Datei[i].isDirectory()) {
                    	copyDir(Datei[i], newFile);
                    	}
                    else {
                        copyFile(Datei[i], newFile);
                   	      }
                  	    }
                  	  }
     }
                   	
                    	 
                  	public void copyFile(File file, File target) throws FileNotFoundException, IOException {
                  	 
                   	  FileChannel in = new FileInputStream(file).getChannel();
                  	  FileChannel out = new FileOutputStream(target).getChannel();
                   	  in.transferTo(0, file.length(), out);
                  	  in.close();
                  	  out.close();
                	}
}
```


----------



## SlaterB (26. Feb 2010)

und du hast keine Idee dazu, auch nicht weiter im Link das richtige Original abschauen?

die Parameter der Methode müssen File sein, nicht String,

  File quelle = new File("C:/Users/Werner/Desktop/peter");
            File ziel = new File("C:/Users/Werner/Desktop/hans");

gehört auch nicht in die Methode, das kommt in die main, mit diesen beiden Files dann die copyDir-Methode erstmals aufrufen


----------



## darkeye2 (27. Feb 2010)

sind bei windows die pfad angaben nicht mit  \ getrennt? normal müsste es doch so ausschauen:
File quelle = new File("C:\\Users\\Werner\\Desktop\\peter");
File ziel = new File("C:\\Users\\Werner\\Desktop\\hans");


----------



## faetzminator (27. Feb 2010)

Es funktioniert in Java auch [c]/[/c]. [c]\[/c] ist sowieso nur wieder eine Erfindung von Windows, darum verwende ich in Java immer [c]/[/c].


----------

