# Files verschieben in einen Ordner



## Lia (9. Apr 2019)

Hi liebes Forum ,

Wieder mal eine Frage,

Ich habe drei Ordner. In dem ersten Ordner habe ich drei Test Dateien (test1,test2,test3)
In dem zweiten Ordner befindet sich bereits eine test1 Datei.

Nun sollen die Dateien aus dem ersten Ordner (test1, test2, test3) in den zweiten verschoben werden (wo test1) bereits drin ist. 

Sobald die Dateien verschoben werden, soll die test1 Datei aus dem zweiten Ordner in ein neuen Ordner Archiv verschoben werden. 

Der Ablauf funktioniert ich lese beide Ordner mit einer foreach Schleife aus. Wenn ich das Programm starte, dann führt er aber nur die erste Schleife aus, sobald ich nochmal das Programm ausführe verschiebt er es dann in den nächsten Ordner. Wieso führt er nicht beide schleifen auf einmal aus ??

Liebe Grüße


----------



## Robat (9. Apr 2019)

Ohne Code kann nicht viel mehr sagen außer, dass du vermutlich was falsch gemacht hast


----------



## Dukel (9. Apr 2019)

Lia hat gesagt.:


> Nun sollen die Dateien aus dem ersten Ordner (test1, test2, test3) in den zweiten verschoben werden (wo test1) bereits drin ist.
> 
> Sobald die Dateien verschoben werden, soll die test1 Datei aus dem zweiten Ordner in ein neuen Ordner Archiv verschoben werden.


Sollte das nicht andersherum passieren? Erst in den Archiv Ordner verschieben, dann in den zweiten Ordner. Sonst überschreibst du erst die Datei, die ins Archiv soll.


----------



## Lia (10. Apr 2019)

Also ich hatte sowas hier schon versucht:

for (File filetest1 in listofFilesTest1)
 if(filtest1.isFile()){ }
for(File filetest2 in listofFilesTest2){}
 if(filetest2.isFile(){ }

die Ordnerstruktur sieht folgendermaßen aus

Ordner1 (liegen die test Dateien 1-3) im Ordner2 liegt noch gar nichts(in den Ordner2 werden die Dateien aus dem Ordner1 einfach hinverschoben)
Wenn eines der Dateien, welches aus dem Ordner1 kommt, bereits in dem Ordner zwei vorhanden ist (was vlt in einem Schritt vorher schonmal reingeschoben wurde welches in dem Fall dann eine ältere Version vn der Datei ist) , soll diese Datei aus Ordner2 ins Archiv verschoben werden. 

Ich denke der Fehler liegt in dem Abschnitt, den ich hier reingepostet habe.. Wenn ich das für das erste Mal ausführe fuktioniert es. Aber beim 3-4 mal schiebt er dann aufeinmal alles weg..

LG


----------



## Xyz1 (10. Apr 2019)

Hallo,
was ist mit diesem Thema https://www.java-forum.org/thema/file-beim-kopieren-in-einen-anderen-ordner-umbenennen.184482/  denn?


----------



## MoxxiManagarm (10. Apr 2019)

Lia hat gesagt.:


> for (File filetest1 in listofFilesTest1)
> if(filtest1.isFile()){ }
> for(File filetest2 in listofFilesTest2){}
> if(filetest2.isFile(){ }


Was ist denn das für eine Klammerung?


----------



## Lia (10. Apr 2019)

@MoxxiManagarm , frag bitte nicht xD, bin einfach nur verzweifelt


----------



## IAmFloppy (10. Apr 2019)

Lia hat gesagt.:


> Wieso führt er nicht beide schleifen auf einmal aus ??



Weil der Code nach der Reihenfolge ausgeführt wird.
Schleife 1 wird ausgeführt » Danach Schleife 2
ist ja normal. Falls du z.B in der ersten Schleife was machst, was du evtl. für die zweite brauchst.


----------



## mihe7 (10. Apr 2019)

Also, mal ganz langsam: 


Lia hat gesagt.:


> Ordner1 (liegen die test Dateien 1-3) im Ordner2 liegt noch gar nichts(in den Ordner2 werden die Dateien aus dem Ordner1 einfach hinverschoben)





Lia hat gesagt.:


> for (File filetest1 in listofFilesTest1)
> if(filtest1.isFile()){ }
> for(File filetest2 in listofFilesTest2){}
> if(filetest2.isFile(){ }


Wenn Du die Dateiliste für Ordner2 erstellst, bevor Du Dateien verschoben hast, ist die Liste leer und bleibt auch nach dem Verschieben leer.


----------



## Lia (10. Apr 2019)

Hi @mihe7 , vielen Dank für deine Nachricht. Das mit dem verschieben habe ich inzwischen gelöst :-D
Ein neues Problem, was jetzt aufgetaucht ist.

Ordner1 = test.xlsx
Ordner2 = test.xlsx
Archiv = test.xlsx

Im Ordner1 laden immer die aktuellste Datei. Diese werden in den Ordner2 verschoben.. falls sich schon im Archiv eine alte Version dieser Dartei befindet(welches ebenfalls den gleichen Namen hat), soll diese mit der neuen Version vom Ordner2 überschrieben werden.. denke es ist wieder verwirred erklärt von mir xD..

_for (int i = 0; i < listofFilesTest1.length;i++){
for (int j= 0; j < listofFilesTest2.length;j++){
for (int k = 0; k < listofFilesTestArchiv.length;k++){
if(listofFilesTest2[j].getName().equals(listofFilesTestArchiv[k].getName())){
listofFilesTestArchiv[k].delete();
}_

An dieser Stelle löscht er diese Datei, dann aber aus allen Ordnern, dass soll nicht passieren. Es soll diese Datei nur gelöscht werden, damit die "neuere " version aus dem zweiten Ordner in dem Archiv hinterlegt werden kann.
(Verwirrung ?) xD

weiß auch nicht genau ob ich dafür eine neue frage aufmachen soll xD


----------



## IAmFloppy (10. Apr 2019)

Kannst du damit was anfangen?
Wenn nein, wäre es gut, wenn du Fragen zum Code stellen würdest.
Es bringt dir natürlich nichts nur den Code zu nehmen, ohne ihn zu verstehen.
Das müsste eigentlich funktionieren.
Wenn du noch Unterordner verschieben willst musst du halt abfragen, ob "file" ein Directory ist und wenn ja, musst du wieder eine for Schleife mit den Unterfiles machen.
Kannst dir auch gerne mal Rekursionen anhand von Files ansehen.


```
/**
     * Will move all files from a folder to another folder
     *
     * @param folder       is the folder which contains the files which you want to move
     * @param targetFolder is the folder where you want to move the files
     */
    private void moveToFolder(File folder, File targetFolder) {
        for (File file : folder.listFiles()) {
            try {
                Files.move(file, new File(targetFolder + "\\" + file.getName()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
```


----------



## Lia (10. Apr 2019)

Hi @IAmFloppy , sehr lieb von dir!
ich hatte das zuerst mit einer Foreach probiert, habe jetzt aber jeweils für jeden Ordner eine for schleife gemacht.. 
Der Ordner2 soll quasi immer wenn es neue neue Datei hinterlegt bekommt (ordner1), die Date die vorher drin war archivieren.
Dh. das "überschreiben" im Archiv Ordner mit der Datei aus dem Ordner2, passiert nur, wenn die Datei in allen drei Ordnern vorhanden ist.


----------



## IAmFloppy (10. Apr 2019)

Das heißt nochmal zur Wiederholung:

Der dritte Ordner ist ein Archivordner?
Und alle Dateien sollen von Ordner1 in Ordner2 verschoben werden.
Und wenn diese schon vorhanden sind, sollen sie überschrieben aber vorher in den dritten Ordner verschoben werden?


----------



## Lia (10. Apr 2019)

Genau, also wenn die Datei schon im Archiv Ordner vorhanden ist.

Somit soll der Ordner 3 immer die "ältere Version" der Datei aus dem Ordner2 haben


----------



## IAmFloppy (10. Apr 2019)

Ich hoffe, dass ich es jetzt richtig geschafft habe. 
Wenn nicht, entschuldige, bin noch ein bisschen müde und verwirrt, weil ich morgen eine Mathearbeit schreibe. xD

Der Code geht alle Dateien des ersten Ordners durch und schaut ob diese Datei auch im zweiten Ordner ist.
Wenn nein, dann movet er sie da rein.
Wenn doch, dann movet er die alte Datei in den Archivordner und movet dann die Datei vom Ordner1 zum Ordner2.


```
private void moveToFolder(File folder1, File folder2, File archiveFolder) {
        try {
            for (File file : folder1.listFiles()) {
                if (folder2.listFiles().length != 0) {
                    for (File folderTwoFile : folder2.listFiles()) {
                        if (file.getName().equals(folderTwoFile.getName())) {
                            Files.move(folderTwoFile.toPath(), new File(archiveFolder.getAbsolutePath() + "\\" + folderTwoFile.getName()).toPath());
                            Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                        } else {
                            Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                        }
                    }
                } else {
                    Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
```


----------



## IAmFloppy (10. Apr 2019)

Wenn du willst, dass die Dateien trotzdem noch in Ordner1 bleiben, auch wenn sie in Ordner2 gemovet wurden, musst du

```
Files.move
```

umändern in


```
Files.copy
```


----------



## mihe7 (10. Apr 2019)

```
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.File;
import java.io.IOException;

public class Test {
    public static void moveAll(File sourceFolder, File destFolder, File archiveFolder) throws IOException {
        Path source = sourceFolder.toPath();
        Path dest = destFolder.toPath();
        Path archive = archiveFolder.toPath();

        assertDirectory(source);
        assertDirectory(dest);
        assertDirectory(archive);
        
        for (File sourceFile : sourceFolder.listFiles()) {
            move(sourceFile.toPath(), dest, archive);
        }
    }

    private static void move(Path sourceFile, Path destFolder, Path archiveFolder) throws IOException {
        if (!Files.isRegularFile(sourceFile)) {
            return;
        }

        Path destPath = destFolder.resolve(sourceFile.getFileName());
        if (Files.exists(destPath)) {
            Files.move(destPath, archiveFolder.resolve(sourceFile.getFileName()));
        }
        Files.move(sourceFile, destPath);
    }

    private static void assertDirectory(Path path) {
        if (!Files.isDirectory(path)) {
            throw new IllegalArgumentException("Not a directory: " + path);
        }
    }    

    public static void main(String[] args) throws Exception {
        moveAll(new File("folder1"), new File("folder2"), new File("folder2/archive"));
    }
}
```


----------



## Lia (12. Apr 2019)

Hi @IAmFloppy danke für deinen Code Ausschnitt, wenn ich es damit ausprobiere, tut er nur den Archiv Ordner verschieben.. sonst passiert nichts


----------



## Lia (12. Apr 2019)

Also in Grunde genommen, funktioniert in meinem Code lassen, außer das er wenn die Datei in allen drei Ordnern existiert , die Datei aus Ordner 2 nicht mit der alter alten Datei aus dem Archiv Order "überschreibt "


----------



## mihe7 (12. Apr 2019)

Du kannst in Files.move mit der CopyOption angeben, dass die Datei überschrieben werden soll (https://docs.oracle.com/javase/8/do...va.nio.file.Path-java.nio.file.CopyOption...-)


----------



## Lia (12. Apr 2019)

Also irgdnwie frag ich mich wieso das nicht funktioniert! 

If (Files.exists (folder2.toPath)){
Files.move(folder2.toPath(), archive.toPath,StandardCopyOption.REPLACE_EXISTING);

Ich nutze die ganze Zeit FileUtils.. macht das Sinn hier Files zu nutzen..

Ich hab auch das Gefühl das das nicht stimmt ^^ ☹️


----------



## mihe7 (12. Apr 2019)

Wo nutzt Du FileUtils und warum? Der Code von @IAmFloppy und mir nutzt ausschließlich Bordmittel. Habe meinen Code gerade nochmal getestet: funktioniert mit REPLACE_EXISTING.


----------



## Lia (12. Apr 2019)

Oh man :-( nutze in meinem Programm FileUtils.Movefiletodir..


----------



## Lia (12. Apr 2019)

Ich zeig Mal wie ich es gemacht habe :




```
For(int i=0; i < listfilesfolder1.legth; I++){
For(int k =0; k < listfilesfolder2.legth; k++) {
If ( listfilesfolder[i].getName().equals(listfilesfolder2[k].getName())){
try {
FileUtils.moveFileFromDirectory(listfilesfolder 2[k], folderdestArchiv,true);
FileUtils.moveFileFromDirectory(listfilesfolder1[i], folderdest,true);
```

... Da irgendwo muss doch jetzt noch der Check stattfinden, dass wenn im Archiv Ordner bereits diese Datei vorhanden ist, wird sie einfach mit der aus dem Ordner 2 überschrieben damit das verschieben funktioniert. Wenn ich's s so ausfuhre tut sich nix weil ich die exception bekomme "File vorhanden"


----------



## mihe7 (12. Apr 2019)

Lia hat gesagt.:


> Ich zeig Mal wie ich es gemacht habe :


For, If großgeschrieben, in der ersten for-Schleife erhöhst Du I statt i -> das kann nicht sein. Und moveFileFrom(?)Directory hört sich auch seltsam an. Ich verstehe auch immer noch nicht, warum Du eine externe Lib für Dinge verwendest, die Java von Haus aus mitbringt.

Nachtrag: ich vermute mal, dass Du Commons-IO FileUtils verwendest. Die move-Methode dort überschreibt keine Dateien, Du müsstest also selbst prüfen, ob es die Zieldatei schon gibt und ggf. löschen.


----------



## Xyz1 (12. Apr 2019)

Also nochmal, was ist Ziel der Sache? Bitte so Einfach wie möglich beschreiben.


----------



## Lia (14. Apr 2019)

@mihe7 


```
for(int i=0; i < listfilesfolder1.legth; i++){
for(int k =0; k < listfilesfolder2.legth; k++) {
If ( listfilesfolder[i].getName().equals(listfilesfolder2[k].getName())){
If(File fileinArchiv : listOfFileinArchive){

if(fileinArchiv.exists() && fileinArchive.getName().equals(listfilesfolder2[k].getName()))

// hier soll dann die Datei aus dem Archiv quasi gelöscht oder mit der Datei aus dem Ordner2"überschrieben werden".

}

try {
FileUtils.moveFileFromDirectory(listfilesfolder 2[k], folderdestArchiv,true);
FileUtils.moveFileFromDirectory(listfilesfolder1[i], folderdest,true);
```
 

Das Problem ist nur, bei mir kommt er erst gar nicht in diese Schleife.. 
Danke euch vielmals für eure Mühe !!


----------



## mihe7 (14. Apr 2019)

Dann ist entweder listfilesfolder1.length == 0 oder listfilesfolder2.length == 0.


----------



## Xyz1 (14. Apr 2019)

Bei mir funktioniert das so

```
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

/**
 * @author tn, 14.04.2019
 */
public class FilesMover {
    public static HashMap<String, ArrayList<File>> moveA(File dir_a, File dir_b) throws IOException {
        HashMap<String, ArrayList<File>> fmap = new HashMap<>();
        fmap.put("copied", new ArrayList<>());
        fmap.put("existent", new ArrayList<>());
        File[] db = dir_b.listFiles();
        Arrays.sort(db);
        for (File fa : dir_a.listFiles()) {
            if (Arrays.binarySearch(db, fa, (File f1, File f2) -> f1.getName().compareTo(f2.getName())) >= 0) {
                fmap.get("existent").add(fa);
            } else {
                Path fb = Path.of(dir_b.getPath(), fa.getName());
                Files.copy(fa.toPath(), fb, StandardCopyOption.REPLACE_EXISTING);
                fmap.get("copied").add(fb.toFile());
            }
        }
        return fmap;
    }

    public static void moveB(HashMap<String, ArrayList<File>> fmap, File dir_b) throws IOException {
        for (File fa : fmap.get("existent")) {
            Path fb = Path.of(dir_b.getPath(), fa.getName());
            Files.copy(fa.toPath(), fb, StandardCopyOption.REPLACE_EXISTING);
            fmap.get("copied").add(fb.toFile());
        }
    }

    public static void main(String[] args) throws IOException {
        try {
            HashMap<String, ArrayList<File>> fmap = moveA(new File("o1"), new File("o2"));
            System.out.println("fmap: " + fmap);
            moveB(fmap, new File("o3"));
        } catch (IOException ioex) {
            System.out.println("ioex: " + ioex.getLocalizedMessage());
            throw ioex;
        }
    }
}
```


```
dir .\o1\
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       14.04.2019     17:13              0 test1.txt
-a----       14.04.2019     17:13              0 test2.txt
-a----       14.04.2019     17:13              0 test3.txt
-a----       14.04.2019     17:13              0 test4.txt

dir .\o2\
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       14.04.2019     17:13              0 test2.txt

dir .\o3\
```


```
fmap: {copied=[o2\test1.txt, o2\test3.txt, o2\test4.txt], existent=[o1\test2.txt]}
```

Danach enthält o2\ also alle Files aus o1\ - und o3\ enthält nur die bereits in o2\ bestehende Datei test2.txt . hth.


----------



## Xyz1 (14. Apr 2019)

Aber nochmal ein Einschub.
`moveB` ändert nochmals die `HashMap`, das ist ggf nicht gewünscht.
Außerdem muss man bei Windows und mehreren Dateien mit gleichen Namen aufpassen. Wenn in o1\ eine Datei test2.txt wäre und in o2\ wäre eine Datei Test2.txt , so würde die Datei Test2.txt aus o2\ mit der Datei test2.txt aus o1\ überschrieben werden. Also gebe es dann mit gleichem Namen nur die Datei test2.txt in o2\. Ich weiß nicht, ob das gewünscht ist.
Falls nicht, so muss man sich `equalsIgnoreCase` schnappen - und mit `equalsIgnoreCase` sortieren und auch suchen. ... Das wiederum würd mit dem Linux FS problematisch werden.
Deswegen frage ich so genau nach, was eigentlich gewünscht ist...


----------



## Lia (14. Apr 2019)

Hi @Tobias-nrw vielen Dank für deinen Post  
Ich würde das gerne versuchen so umzusetzen wie ich es die ganze Zeit probiere :-(
Es gibt drei Ordner: Ordner1, Ordner2 und das Archiv.
Als erstes befindet sich in dem ersten Ordner eine Test-Datei "aktuelleMitarbeiter" (zum Beispiel) , solch eine Liste wird sich ja immer wieder ändern. Diese Liste befindet sich am Anfang in dem Ordner1 und wird dann direkt in den Ordner2 verschoben(damit hier quasi immer die aktuelle Liste drin ist). So, wenn jetzt zum Beispiel die "aktuelleMitarbeiter" -Liste wieder neu bearbeitet und in den Ordner1 geschoben wird, soll die alte "aktuelleMitarbeiter" Datei in den Archiv-Ordner verschoben werden. Damit die neue Datei von Ordner 1 sich im Ordner2 verschoben werden kann. Dh. wenn sich quasi nichts tut, dann ist der Ordner1 leer, der Ordner2 enthält den aktuellen Stand der "aktuelleMitarbeiter" Datei und das Archiv enthält die vorherige Version der "aktuelleMitarbeiter" Datei.

Hoffe das ist verständlich  

Danke.


----------



## IAmFloppy (14. Apr 2019)

Lia hat gesagt.:


> for(int i=0; i < listfilesfolder1.legth; i++){ for(int k =0; k < listfilesfolder2.legth; k++) { If ( listfilesfolder_.getName().equals(listfilesfolder2[k].getName())){ If(File fileinArchiv : listOfFileinArchive){ if(fileinArchiv.exists() && fileinArchive.getName().equals(listfilesfolder2[k].getName())) // hier soll dann die Datei aus dem Archiv quasi gelöscht oder mit der Datei aus dem Ordner2"überschrieben werden". } try { FileUtils.moveFileFromDirectory(listfilesfolder 2[k], folderdestArchiv,true); FileUtils.moveFileFromDirectory(listfilesfolder1, folderdest,true);_



Ist denn einer dieser Ordner leer?
Wenn ich nicht gerade komplett blöd, wegen der Prüfungsphase, bin, müsste das ganze nicht durchgeführt werden, wenn der erste oder zweite Ordner leer sind.
Kannst du uns sagen, wie weit es in der for-Schleife geht?


----------



## Xyz1 (14. Apr 2019)

Tobias-nrw hat gesagt.:


> Falls nicht, so muss man sich `equalsIgnoreCase` schnappen - und mit `equalsIgnoreCase` sortieren und auch suchen.


Ach sorry, my fault, mit `equalsIgnoreCase` zu sortieren oder zu suchen ist keine gute Idee .... 

Also mal kurze Frage, hast du im zweiten Verzeichnis Dateien mit gleichen Namen wie im ersten Verzeichnis aber zum Beispiel groß-/kleingeschrieben?


----------



## Xyz1 (14. Apr 2019)

IAmFloppy hat gesagt.:


> Ist denn einer dieser Ordner leer?
> Wenn ich nicht gerade komplett blöd, wegen der Prüfungsphase, bin, müsste das ganze nicht durchgeführt werden, wenn der erste oder zweite Ordner leer sind.
> Kannst du uns sagen, wie weit es in der for-Schleife geht?


Prüfungsphasen? sind nicht gerade Ferien oder der Semesterbeginn.


----------



## Lia (14. Apr 2019)

@IAmFloppy 
Der Ordner 1 ist quasi immer leer , weil er die aktuelle Datei in den zweiten Ordner schiebt und der zweite Ordner seine "ältere Verison" mit dem was bereits im Archiv ist überschreibt oder löscht und ersetzt.


----------



## Xyz1 (14. Apr 2019)

Lia hat gesagt.:


> Der Ordner 1 ist quasi immer leer


Wenn der überwiegend leer ist, wird überwiegend auch nix verschoben oder kopiert.  Schönen abend aber noch.


----------



## Lia (14. Apr 2019)

Gleichfalls danke 
wenn ich zb @mihe7 sein Code ausführe, funktioniert er soweit wie meiner, aber sobald ich in allen drei Ordnern die selbe Datei habe und quasi versuche wieder die aktuelle testdatei in den Ordner2 zu verschieben kommt die meldung" File Already exist"


----------



## IAmFloppy (14. Apr 2019)

Tobias-nrw hat gesagt.:


> Prüfungsphasen? sind nicht gerade Ferien oder der Semesterbeginn.



Ich schreibe leider direkt nach den Ferien meine Abschlussprüfungen für die Realschule .-. Deswegen heißt es üben, üben, üben.
Aber zurück zum Thema



Lia hat gesagt.:


> Gleichfalls danke
> wenn ich zb @mihe7 sein Code ausführe, funktioniert er soweit wie meiner, aber sobald ich in allen drei Ordnern die selbe Datei habe und quasi versuche wieder die aktuelle testdatei in den Ordner2 zu verschieben kommt die meldung" File Already exist"



Können wir nochmal deinen Code sehen? Denn wie die Fehlermeldung ja schon sagt, replaced du die File nicht, wenn sie schon existiert


----------



## Lia (14. Apr 2019)

@IAmFloppy , viel Erfolg 


```
for(int i=0; i < listfilesfolder1.legth; i++){
for(int k =0; k < listfilesfolder2.legth; k++) {
If ( listfilesfolder[i].getName().equals(listfilesfolder2[k].getName())){
If(File fileinArchiv : listOfFileinArchive){

if(fileinArchiv.exists() && fileinArchive.getName().equals(listfilesfolder2[k].getName()))

// hier soll dann die Datei aus dem Archiv quasi gelöscht oder mit der Datei aus dem Ordner2"überschrieben werden".

}
else{


}

try {
FileUtils.moveFileFromDirectory(listfilesfolder2[k], folderdestArchiv,true);
FileUtils.moveFileFromDirectory(listfilesfolder1[i], folderdest,true);
```

Weisst du, ich bin mittlerweile selbst so verwirrt, ich weiß nicht mal mehr was mein Code macht xD


----------



## IAmFloppy (14. Apr 2019)

Versuch mal das 

```
# Als erstes brauchst du die File, die überschrieben werden soll. Also die im Archiv
File archiveFile = new File(fileDieImArchivIst);

# Dann fragst du ab, ob diese Datei existiert
if(archiveFile.exists()) {
# Wenn ja, dann wird die Datei im Archiv gelöscht
    archiveFile.delete();
}

# Die neue Datei ((fileDieInsArchivSoll) wird in den Archivordner gemoved.
FileUtils.moveFileToDirectory(fileDieInsArchivSoll, archivOrdnerAlsFile, true);
```


----------



## Lia (14. Apr 2019)

im try Block??


----------



## IAmFloppy (14. Apr 2019)

Da wo du 

```
// hier soll dann die Datei aus dem Archiv quasi gelöscht oder mit der Datei aus dem Ordner2"überschrieben werden".
```
geschrieben hast


----------



## IAmFloppy (14. Apr 2019)

Hier nochmal für deinen gesendeten Code umgeschrieben:

```
if(fileinArchiv.exists()) {
    fileinArchiv.delete();
}

FileUtils.moveFileToDirectory(listfilesfolder2[k], folderdestArchiv, true);
```


----------



## Lia (14. Apr 2019)

ok also irgendwas stimmt nicht, schau mal das ist mein ganzer Code:




```
for (File fileinFolder1 :listofFilesinF1){
    try{
    FileUtils.moveFileToDirectory(fileinFolder1,folder2,true);
    }
catch(){

}
}

for(int i = 0; i < listofFilesinF1.length(), i++){
    for(int k = 0; k < listofFilesinF2.length(), k++){
    
    if(listofFilesinF1[i].getName().equals(listofFilesinF2[k])){
    
    for(File fileinArchive : listofFileinArchive){
    
    if(fileinArchive.exists()){
    fileinArchive.delete();
    }
    
    FileUtils.moveFileToDirectory(listofFilesinF2[k], folderarchive,true);
    try{
    FileUtils.moveFileToDirectory(listofFilesinF2[k], folderarchive,true);
    }
    
    catch()
    {
    
    }
    
    }
    }
    }



}
```

So die Sache ist, es sollen auch nicht alle Dateien in dem Archiv gelöscht werden oder ersetzt, nur die um die es sich quasi handelt. 

Danke


----------



## IAmFloppy (14. Apr 2019)

```
private void moveToFolder(File folder1, File folder2, File archiveFolder) {
        try {
            for (File file : folder1.listFiles()) {
                if (folder2.listFiles().length != 0) {
                    for (File folderTwoFile : folder2.listFiles()) {
                        if (file.getName().equals(folderTwoFile.getName())) {
                            Files.move(folderTwoFile.toPath(), new File(archiveFolder.getAbsolutePath() + "\\" + folderTwoFile.getName()).toPath());
                            Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                        } else {
                            Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                        }
                    }
                } else {
                    Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
```

Was ging denn damals daran nicht? Bei mir ging es eigentlich ganz gut 
Probier es damit nochmal
Einfach nur

```
moveToFolder(new File("ordner1"), new File("ordner2"), new File("archiv"));
```


----------



## Lia (14. Apr 2019)

Wenn ich deinen Code ausführe verschiebt er bei mir den Archiv Ordner in den Ordner2  ich könnte heulen


----------



## IAmFloppy (14. Apr 2019)

Verschiebt er den ganzen Ordner oder nur die Dateien vom Archiv Ordner?
Und sind das normale Ordner oder irgendwas spezielles? (ZIP oder so)


----------



## Lia (14. Apr 2019)

den ganzen Ordner, hab nur unten in der Funktion meine Pfade eingefügt, also an deinem Code nichts geändert.
Und das:

java.nio.file.NoSuchFileException: C:\Users\Lias\Desktop\test\Archiv
    at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)


----------



## IAmFloppy (14. Apr 2019)

Hast du als Pfad
"C:\\Users\\Lias\\Desktop\\test\\Archiv"
eingegeben?


----------



## IAmFloppy (14. Apr 2019)

Und kannst du mir mal die Zeile zeigen?
Also wie sieht die Zeile bei dir aus:

```
moveToFolder(new File("ordner1"), new File("ordner2"), new File("archiv"));
```


----------



## Lia (14. Apr 2019)

moveToFolder(new File("C:\\Users\\Lias\\Desktop\\test"), new File("C:\\Users\\Lias\\Desktop\\test\\FS"), new File("C:\\Users\\Lias\\Desktop\\test\\Archiv"));


----------



## IAmFloppy (14. Apr 2019)

achsoooooo
Der Archiv Ordner ist in deinem Ordner 1 drin?
Mach mal den Archiv Ordner kurz aus deinem Test Ordner raus und versuche es nochmal mit dem neuen Pfad
Beim Ordner2 dasselbe


----------



## IAmFloppy (14. Apr 2019)

Hier nochmal eine verbesserte Version der Methode:


```
private void moveToFolder(File folder1, File folder2, File archiveFolder) {
        try {
            for (File file : folder1.listFiles()) {
                if (folder2.listFiles().length != 0) {
                    for (File folderTwoFile : folder2.listFiles()) {
                        if (file.getName().equals(folderTwoFile.getName())) {
                            Files.move(folderTwoFile.toPath(), new File(archiveFolder.getAbsolutePath() + "\\" + folderTwoFile.getName()).toPath());
                            Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                        } else {
                            Files.copy(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                        }
                    }
                } else {
                    Files.copy(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
```

Und teste es mal mit

```
moveToFolder(new File("C:\\Users\\Lias\\Desktop\\test"), new File("C:\\Users\\Lias\\Desktop\\test2"), new File("C:\\Users\\Lias\\Desktop\\Archiv"));
```

Musst natürlich die Ordner dann auch kurz so verschieben


----------



## Lia (14. Apr 2019)

Also ich peil gerade gar nix mehr xD , man das tut mir sooo leid 
wenn ich das so ausführe kopiert er mir jetzt alles inkl Ordner (die gleiche Struktur) in den Ordner2????? 
Genau in Ordner1 sind der ARCHIV Ordner und der Ordner2


----------



## IAmFloppy (14. Apr 2019)

Es ist gerade wirklich etwas verwirrend, ist aber nicht deine Schuld, da gerade Missverständnisse aufgetreten sind xD
Also die Methode verschiebt quasi alle Dateien in Ordner1 in Ordner2 und wenn diese Datei schon in Ordner2 existiert, überschreibt er sie, nachdem er sie ins Archiv schickt.
Und die Ordner, die du in deinem Test Ordner hast sind eben auch Dateien. Aber das lässt sich denke ich mal beheben.
Ich schicke dir in einer Minute eine neue Version, die das beheben müsste


----------



## mihe7 (14. Apr 2019)

Lia hat gesagt.:


> wenn ich zb @mihe7 sein Code ausführe, funktioniert er soweit wie meiner, aber sobald ich in allen drei Ordnern die selbe Datei habe und quasi versuche wieder die aktuelle testdatei in den Ordner2 zu verschieben kommt die meldung" File Already exist"


Aber doch nicht, wenn Du StandardCopyOption.REPLACE_EXISTING verwendest, oder?


----------



## IAmFloppy (14. Apr 2019)

```
private void moveToFolder(File folder1, File folder2, File archiveFolder) {
        try {
            for (File file : folder1.listFiles()) {
                if (!file.isDirectory()) {
                    if (folder2.listFiles().length != 0) {
                        for (File folderTwoFile : folder2.listFiles()) {
                            if (!folderTwoFile.isDirectory()) {
                                if (file.getName().equals(folderTwoFile.getName())) {
                                    Files.move(folderTwoFile.toPath(), new File(archiveFolder.getAbsolutePath() + "\\" + folderTwoFile.getName()).toPath());
                                    Files.copy(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                                } else {
                                    Files.copy(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                                }
                            }
                        }
                    } else {
                        Files.copy(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
```

Jetzt kannst du es wie vorher ausprobieren mit 

```
moveToFolder(new File("C:\\Users\\Lias\\Desktop\\test"), new File("C:\\Users\\Lias\\Desktop\\test\\FS"), new File("C:\\Users\\Lias\\Desktop\\test\\Archiv"));
```


----------



## Lia (14. Apr 2019)

genau das funktioniert soweit wobei dir dateien auch nicht im Ordner1 bleiben sollten  , und wenn ich dann eine test1.txt wieder versuche von ordner1 aus zu verschieben, bekomme ich die fehlermeldung already exist exception..
Das stimmt ja auch, die Datei befindet sich ja auch in allen drei Ordnern aber das Archiv soll ja wieder eine neue version bekomme aus Ordner2..

Bist vermutlich genervt von mir xD


----------



## IAmFloppy (14. Apr 2019)

Ich bin nicht so schnell von Menschen genervt, vor allem nicht, wenn sie ein Problem haben und Hilfe brauchen 
Ich helfe dir gerne, da ich gerade eh nichts zu tun habe xD
Also willst du, dass die Datei, die von Ordner1 in Ordner2 verschoben wird, dann auch entfernt wird?
Kannst du mir mal die genaue Fehlermeldung senden? Oder steht da wirklich nur "File already exists"?


----------



## Lia (14. Apr 2019)

Wie lieb vielen Dank 
genau von Ordner1 in Ordner2 (aber wird von Ordner1 aus quasi verschoben in Ordner2) und dann von Ordner2 das was vorher in Ordner2 drin war in den Archiv Ordner


----------



## IAmFloppy (14. Apr 2019)

```
private void moveToFolder(File folder1, File folder2, File archiveFolder) {
    try {
        for (File file : folder1.listFiles()) {
            if (!file.isDirectory()) {
                if (folder2.listFiles().length != 0) {
                    for (File folderTwoFile : folder2.listFiles()) {
                        if (!folderTwoFile.isDirectory()) {
                            if (file.getName().equals(folderTwoFile.getName())) {
                                Files.move(folderTwoFile.toPath(), new File(archiveFolder.getAbsolutePath() + "\\" + folderTwoFile.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
                                Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
                            } else {
                                Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
                            }
                        }
                    }
                } else {
                    Files.move(file.toPath(), new File(folder2.getAbsolutePath() + "\\" + file.getName()).toPath(), StandardCopyOption.REPLACE_EXISTING);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
```

Versuchs mal damit. 
Ich habe jetzt 
	
	
	
	





```
StandardCopyOption.REPLACE_EXISTING
```
 hinzugefügt.
Das heißt, wie du es wahrscheinlich schon bemerkt hast, dass es eben eine existierende Datei überschreiben soll, falls sie überhaupt da ist.
Damit müsste es eigentlich funktionieren.


----------



## IAmFloppy (14. Apr 2019)

Mensch, wir sitzen jetzt schon so lange an einer kleinen Funktion 
Google Mitarbeiter würden uns jetzt wahrscheinlich auslachen xD
Ich bin froh, wenn wir das Problem gelöst haben


----------



## Lia (14. Apr 2019)

xDDD frag mich mal


----------



## IAmFloppy (14. Apr 2019)

Schreib dann, wenns funktioniert oder nicht funktioniert


----------



## Lia (14. Apr 2019)

ok also, es funktioniert FAST XD
wenn ich es aus dem Ordner1 zb mit einer test2.txt probiere, löscht sie sich aus dem Ordner2 und ich bekomme die exception java.nio.file.NoSuchFileException: C:\Users\Lias\Desktop\test\test2.xlsx



Und noch eine Frage nebenbei, gibt es eine Funktion, die alle dateien aus dem Ordner nimmt? weil im moment muss ich es immer ausführen damit er jede einzeln in den Ordner2 schiebt :/


----------



## mihe7 (14. Apr 2019)

Ich will Euch ja nicht stören, aber funktioniert das hier nicht?

```
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.io.File;
import java.io.IOException;

public class Test {
    public static void moveAll(File sourceFolder, File destFolder, File archiveFolder) throws IOException {
        Path source = sourceFolder.toPath();
        Path dest = destFolder.toPath();
        Path archive = archiveFolder.toPath();

        assertDirectory(source);
        assertDirectory(dest);
        assertDirectory(archive);
        
        for (File sourceFile : sourceFolder.listFiles()) {
            move(sourceFile.toPath(), dest, archive);
        }
    }

    private static void move(Path sourceFile, Path destFolder, Path archiveFolder) throws IOException {
        if (!Files.isRegularFile(sourceFile)) {
            return;
        }

        Path destPath = destFolder.resolve(sourceFile.getFileName());
        if (Files.exists(destPath)) {
            Files.move(destPath, archiveFolder.resolve(sourceFile.getFileName()), StandardCopyOption.REPLACE_EXISTING);
        }
        Files.move(sourceFile, destPath);
    }

    private static void assertDirectory(Path path) {
        if (!Files.isDirectory(path)) {
            throw new IllegalArgumentException("Not a directory: " + path);
        }
    }    

    public static void main(String[] args) throws Exception {
        moveAll(new File("folder1"), new File("folder2"), new File("folder2/archive"));
    }
}
```


----------



## Lia (14. Apr 2019)

wenn ich deinen @mihe7 Code ausführe, funktioniert er soweit wie meiner, aber sobald ich in allen drei Ordnern die selbe Datei habe und quasi versuche wieder die aktuelle testdatei in den Ordner2 zu verschieben kommt die Meldung" File Already exist"


----------



## Lia (14. Apr 2019)

Finde den Code von @IAmFloppy auch super, aber da löscht sich die Datei irgendwie aus dem Ordner2 wenn ich nochmal versuche es zu verschieben


----------



## mihe7 (14. Apr 2019)

Lia hat gesagt.:


> wenn ich deinen @mihe7 Code ausführe, funktioniert er soweit wie meiner, aber sobald ich in allen drei Ordnern die selbe Datei habe und quasi versuche wieder die aktuelle testdatei in den Ordner2 zu verschieben kommt die Meldung" File Already exist"


Hast Du den zuletzt gepostesten Code probiert und nur in main die Ordner entsprechend angepasst?


----------



## Lia (14. Apr 2019)

Ja  alles gemacht


----------



## mihe7 (14. Apr 2019)

:-o kannst Du genau beschreiben, was Du gemacht hast? In welcher Zeile tritt die Exception auf?


----------



## IAmFloppy (14. Apr 2019)

Ich sende gleich nochmal Code


----------



## Lia (14. Apr 2019)

OK ICH FRESS N BESEN, es Funktioniert!!!!!!!!


----------



## IAmFloppy (14. Apr 2019)

Lia hat gesagt.:


> wenn ich es aus dem Ordner1 zb mit einer test2.txt probiere, löscht sie sich aus dem Ordner2 und ich bekomme die exception java.nio.file.NoSuchFileException: C:\Users\Lias\Desktop\test\test2.xlsx


Du hast es mit einer .txt Datei probiert aber bekommst den Fehler von einer xlsx? Das ist äußerst komisch.
Eigentlich dürfte es sich nicht löschen, ich habe den Fehler bei mir nicht feststellen können.


----------



## IAmFloppy (14. Apr 2019)

Oh, es funktioniert. Glückwusch 
Kannst du uns mal den Code zeigen, damit wir sehen, was du jetzt so hast


----------



## Lia (14. Apr 2019)

@mihe7 hatttest du was am Code geändert??? also vom letzten Post ??


----------



## Lia (14. Apr 2019)

habe das jetzt mal mit @mihe7 seinem Code probiert , habe noch eine kleine Frage, was bedeutet "assertDirectory"? also habe vorher nichts davon gehört :/

Danke vielmals euch beiden


----------



## IAmFloppy (14. Apr 2019)

mihe7 hat gesagt.:


> private static void assertDirectory(Path path) { if (!Files.isDirectory(path)) { throw new IllegalArgumentException("Not a directory: " + path); } }



Seine Methode "assertDirectory" schaut einfach nur, ob eine bestimmte File/ ein Path ein Ordner ist. Wenn nein, dann wirft er eine IllegalArgumentException ^^


----------



## Lia (14. Apr 2019)

im Grunde genommen braucht man es aber nicht oder ?


----------



## Xyz1 (14. Apr 2019)

IAmFloppy hat gesagt.:


> Versuchs mal damit


Ist von der Tiefe her nicht so schön



Lia hat gesagt.:


> OK ICH FRESS N BESEN, es Funktioniert


mihe's und meins funktionierte aber Seiten zuvor auch schon...


----------



## IAmFloppy (14. Apr 2019)

Tobias-nrw hat gesagt.:


> Ist von der Tiefe her nicht so schön


Kannst du mir erklären, was daran nicht so gut ist? Nehme gerne Kritik an


----------



## mihe7 (14. Apr 2019)

Lia hat gesagt.:


> OK ICH FRESS N BESEN, es Funktioniert!!!!!!!



Gott sei Dank, ich habe mich hier mental schon auf einen Bug-Report eingestellt.



Lia hat gesagt.:


> @mihe7 hatttest du was am Code geändert??? also vom letzten Post ??


Ja, das was ich in Kommentar #22 geschrieben habe: REPLACE_EXISTING hinzugefügt, damit die vorhandene Datei überschrieben wird.



Lia hat gesagt.:


> im Grunde genommen braucht man es aber nicht oder ?


Was heißt brauchen? Du kannst es weglassen und es wird trotzdem funktionieren. Mit den assert-Teilen wird nur sichergestellt, dass die Voraussetzungen gegeben sind.


----------



## Lia (14. Apr 2019)

@mihe7 xDDD gut das es nicht soweit kam xD

vlt ne dumme Frage, aber dieses asset gibt es auch so als funktion oder ? (Frage nur aus intresse )


----------



## mihe7 (14. Apr 2019)

Es gibt in Java eine assert-Anweisung, die zu Fehlern (AssertionError) führt, wenn die angegebene Bedingung nicht eingehalten wurde. Diese sind standardmäßig deaktiviert und werden zum Testen aktiviert. 

Das andere sind einfach ganz gewönliche selbstgeschriebene Methoden. Ich hätte es z. B. auch `methodeDieSicherstelltDasDerAngegebenePfadAuchWirklichEinVerzeichnisIst` nennen können, das war mir dann aber doch zu lang


----------



## Lia (14. Apr 2019)

xD ok alles klar. Man lernt hier nie aus. Vielen Dank für eure Mühe !!!


----------



## Xyz1 (14. Apr 2019)

IAmFloppy hat gesagt.:


> Kannst du mir erklären, was daran nicht so gut ist? Nehme gerne Kritik an


Kann ich,
1. es ist nicht nur unschön, es ist auch falsch,
2. es käme durch kein professionelles Review,
3. man merkt daran, dass Du noch Anfänger bist.

Merke: Je kompakter der Code (horizontal gesehen), desto mehr Skills hatte derjenige der es geschrieben hat.

Längere als 20 Zeilen-Methoden werden dagegen heute nicht mehr so genau gesehen und gelten als obsolet.


----------



## IAmFloppy (15. Apr 2019)

Tobias-nrw hat gesagt.:


> 2. es käme durch kein professionelles Review,


Kannst du mir mehr erklären, wieso das so ist? 



Tobias-nrw hat gesagt.:


> 3. man merkt daran, dass Du noch Anfänger bist.


Das stimmt ^^ Ich bin ja auch erst 15 und hatte das noch nie in der Schule  Kommt aber alles noch



Tobias-nrw hat gesagt.:


> Längere als 20 Zeilen-Methoden werden dagegen heute nicht mehr so genau gesehen und gelten als obsolet.


Das wusste ich tatsächlich noch nicht  Naja jetzt weiß ich es.

Danke für die Kritik und gute Nacht


----------



## mihe7 (16. Apr 2019)

IAmFloppy hat gesagt.:


> Kannst du mir mehr erklären, wieso das so ist?


Mal ein paar Punkte:

1. folder1, folder2 und folderTwoFile sind keine aussagekräftigen Bezeichner.
2. Wenn Du nur den Rumpf der Methode betrachtest, weißt Du nicht "sofort", worum es in der Methode geht
3. Wiederholung von Code (die Zeile `Files.move(file.toPath(), ...)` taucht dreimal auf)
4. Fehler: die Existenz einer Datei wird durch einen String-Vergleich ermittelt. Das führt bei Dateisystemen, die case insensitive arbeiten ggf. dazu, dass Daten verloren gehen.

Bei meinem Code könnte man z. B. bemängeln, dass assertDirectory dreimal wiederholt wird, auch kann man sich fragen, ob die Methoden überhaupt benötigt wird. Außerdem sollte man moveAll auf zwei Methoden aufteilen: eine für File-Objekte und eine für Path-Objekte.


----------

