Files verschieben in einen Ordner

moveToFolder(new File("C:\\Users\\Lias\\Desktop\\test"), new File("C:\\Users\\Lias\\Desktop\\test\\FS"), new File("C:\\Users\\Lias\\Desktop\\test\\Archiv"));
 
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
 
Hier nochmal eine verbesserte Version der Methode:

Java:
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
Java:
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
 
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
 
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
 
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?
 
Java:
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
Java:
moveToFolder(new File("C:\\Users\\Lias\\Desktop\\test"), new File("C:\\Users\\Lias\\Desktop\\test\\FS"), new File("C:\\Users\\Lias\\Desktop\\test\\Archiv"));
 
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 🙁
 
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"?
 
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
 
Java:
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
Java:
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. 😀
 
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
 
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 :/
 
Ich will Euch ja nicht stören, aber funktioniert das hier nicht?
Java:
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"));
    }
}
 
🙂
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"
 
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?
 
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. 🙁
 
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 🙂
 
OK ICH FRESS N BESEN, es Funktioniert!!!!!!!

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

@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.

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.
 
@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 😀)
 
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 🙂
 
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.
 
2. es käme durch kein professionelles Review,
Kannst du mir mehr erklären, wieso das so ist? 🙂

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

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 🙂
 
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.
 

Neue Themen


Zurück
Oben