Problem bei Kopieren eines Ordners

Status
Nicht offen für weitere Antworten.

rtt

Bekanntes Mitglied
Hallo,
ich würde gern ein Verzeichnis kopieren, leider klappt das so nicht:

Code:
	String src  = "C:\\temp\\copytest";
	String dest = "C:\\temp\\copysuccess";
		
	File[] files = new File(src).listFiles(); 
		
	new File(dest).mkdirs();
		 
	for ( int n=0; n<files.length; n++ ) {
		new File(files[n]).renameTo(dest + "/" + files[n]);
	}

Kann mir da jemand helfen?
Danke
Gruß Robin
 
Habs jetzt so gemacht. Funktioniert auch teilweise. Bekomme nur bei manchen Dateien oder Verzeichnissen eine
FileNotFoundException (Zugriff verweigert).

Code:
File[] files = new File(src).listFiles(); 
String[] list = new File(src).list(); 
		
new File(dest).mkdirs();
		 
for ( int n=0; n<list.length; n++ ) {
			
	System.out.println("File: "+list[n]);
			
			
	FileReader in  = new FileReader(src + "/" + list[n]); 
        FileWriter out = new FileWriter(dest + "/" + list[n]); 
        int i;
        while ((i = in.read()) != -1) {
            	out.write(i); 
        }    
        in.close(); 
        out.close();
}

Weiß einer Rat?
Danke
 
Hm, er wirft die Exception, sobald er ein Verzeichnis kopieren soll. Er erkennt wahrscheinlich nicht, das das ein Verzeichnis ist.
Wie kann ich ihm sagen, dass er das Unterverzeichnis auch mit kopieren soll?
 
hab mir deinen source nicht angeguckt, aber warum kontrollierst du innerhalb der schleife nicht einfach ob es ein verzeichnis ist ? isDirectory()
 
wie kann ich denn ein Verzeichnis rekursiv kopieren? Und was ist mit weiteren Unterordnern in diesem Ordner? Wird das dann auch mit kopiert, oder muß ich da auch wieder prüfen?
 
Du schreibst Dir eine Methode copyFiles und übergibst ihr einen Ordner; per 'listFiles' holst Du dir alle Dateien aus dem Ordner und in einer Schleife prüfst Du für jedes File, ob es eine DIR ist, oder nicht. Für den Fall, dass es ein DIR ist, rufst Du die Methode copyFiles auf; falls es sich nicht um ein DIR handelt so kopierst Du die Datei.
 
Hab jetzt so gemacht 🙂

Code:
public void copyDirectory( String src, String dest ) throws IOException {
				
		File[] files = new File(src).listFiles(); 
		String[] list = new File(src).list(); 
		
		new File(dest).mkdirs();
		 
		 
		for ( int n=0; n<list.length; n++ ) {
			
			if ( files[n].isDirectory() == true ) {
							
				System.out.println(src+"\\"+list[n].toString()+" - "+dest+"\\"+list[n].toString());
				copyDirectory(src+"\\"+list[n].toString(),dest+"\\"+list[n].toString());
			}
			else {
			
				System.out.println("File: "+list[n]);
							
				FileReader in  = new FileReader(src + "/" + list[n]); 
	        	FileWriter out = new FileWriter(dest + "/" + list[n]); 
	          	int i;
	          	
	         	while ((i = in.read()) != -1) {
	            	out.write(i); 
	            }    
	         	in.close(); 
	         	out.close();
         	}
		}
	}

Läuft sehr gut. Habt ihr irgendwelche Verbesserungsvorschläge, oder ist das schon so OK?
Gruß Robin
 
Hab jetzt den BufferedReader/Writer genommen. Geht wirklich merkbar schneller.

Vielen Dank.
 
Wie kann ich denn eigentlich die Dateigröße bzw die Größe des Ordners herrausfinden?
 
rtt hat gesagt.:
wie kann ich denn ein Verzeichnis rekursiv kopieren? Und was ist mit weiteren Unterordnern in diesem Ordner? Wird das dann auch mit kopiert, oder muß ich da auch wieder prüfen?

Genau das macht "rekursives Kopieren" aus.

Du nimmst ein Objekt, dass kopiert. Als Eingabe bekommt es dazu den zu kopierenden Ordner(und natürlich auch das Ziel...)
So und so bald es auf einen Ordner stößt, ruft es ein neues Objekt, seiner eigenen Klasse auf, dass dann wieder zu kopieren beginnt. Das nennt man rekursiv!
 
MPW hat gesagt.:
rtt hat gesagt.:
wie kann ich denn ein Verzeichnis rekursiv kopieren? Und was ist mit weiteren Unterordnern in diesem Ordner? Wird das dann auch mit kopiert, oder muß ich da auch wieder prüfen?

Genau das macht "rekursives Kopieren" aus.

Du nimmst ein Objekt, dass kopiert. Als Eingabe bekommt es dazu den zu kopierenden Ordner(und natürlich auch das Ziel...)
So und so bald es auf einen Ordner stößt, ruft es ein neues Objekt, seiner eigenen Klasse auf, dass dann wieder zu kopieren beginnt. Das nennt man rekursiv!
Die Frage wurde schon beantwortet. rtt hat sogar schon seine Lösung gezeigt.


rtt hat gesagt.:
Wie kann ich denn eigentlich die Dateigröße bzw die Größe des Ordners herrausfinden?
inkl. Unterordner?? Rekursiv... Hast Du doch vom Prinzip her gemacht... musst nur noch die Größen addieren:

Code:
  public long getFileSize( File f ) {
    if ( !f.isDirectory() ) {
      return f.length();
    }

    long size = 0;
    File[] files = f.listFiles();
    for (int i = 0; i < files.length; i++) {
      size += getFileSize( files[i] );
    }
    return size;
  }
 
sky80 hat gesagt.:
MPW hat gesagt.:
rtt hat gesagt.:
wie kann ich denn ein Verzeichnis rekursiv kopieren? Und was ist mit weiteren Unterordnern in diesem Ordner? Wird das dann auch mit kopiert, oder muß ich da auch wieder prüfen?

Genau das macht "rekursives Kopieren" aus.

Du nimmst ein Objekt, dass kopiert. Als Eingabe bekommt es dazu den zu kopierenden Ordner(und natürlich auch das Ziel...)
So und so bald es auf einen Ordner stößt, ruft es ein neues Objekt, seiner eigenen Klasse auf, dass dann wieder zu kopieren beginnt. Das nennt man rekursiv!
Die Frage wurde schon beantwortet. rtt hat sogar schon seine Lösung gezeigt.

Sorry, hab' ich nicht gelesen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben