Wie verschiebe ich eine Datei in Java von einem Speicherort an einen anderen?


91

Wie verschiebt man eine Datei von einem Ort an einen anderen? Wenn ich mein Programm ausführe, wird jede an diesem Speicherort erstellte Datei automatisch an den angegebenen Speicherort verschoben. Woher weiß ich, welche Datei verschoben wird?


Zuerst fragen Sie, wie eine Datei verschoben werden soll, dann sagen Sie, dass einige Dateien automatisch verschoben werden. Können Sie Ihre Frage klarer stellen?
Jaime Hablutzel

Antworten:


127
myFile.renameTo(new File("/the/new/place/newName.file"));

File # renameTo macht das (es kann nicht nur umbenennen, sondern auch zwischen Verzeichnissen wechseln, zumindest im selben Dateisystem).

Benennt die mit diesem abstrakten Pfadnamen angegebene Datei um.

Viele Aspekte des Verhaltens dieser Methode sind von Natur aus plattformabhängig: Der Umbenennungsvorgang kann eine Datei möglicherweise nicht von einem Dateisystem in ein anderes verschieben, ist möglicherweise nicht atomar und erfolgreich, wenn eine Datei mit dem abstrakten Zielpfadnamen erfolgreich ist ist bereits vorhanden. Der Rückgabewert sollte immer überprüft werden, um sicherzustellen, dass der Umbenennungsvorgang erfolgreich war.

Wenn Sie eine umfassendere Lösung benötigen (z. B. die Datei zwischen Datenträgern verschieben möchten ), lesen Sie Apache Commons FileUtils # moveFile


9
myFile.renameTo (neue Datei ("/ the / new / place / newname.file"));
Djangofan

4
Ja, geben Sie nicht nur das neue übergeordnete Verzeichnis an. Und stellen Sie sicher, dass der Pfad dort bereits vorhanden ist.
Thilo

2
Beachten Sie, dass der myFilePfad des Objekts durch diesen Befehl nicht aktualisiert wird. Es wird also auf eine Datei verweisen, die nicht mehr vorhanden ist.
Evgeni Sergeev

1
@ Sulemankhan - ja, es löscht auch die Datei. Es bewegt es wirklich auf dem Dateisystem
leole

2
@ JulienKronegg: Das hängt wahrscheinlich von Ihrem Betriebssystem / Dateisystem ab. Ich denke, unter Linux können Sie aktuell geöffnete Dateien verschieben (oder löschen) (und weiterhin über das vorhandene Dateihandle darauf zugreifen), jedoch nicht unter Windows.
Thilo

62

Mit Java 7 oder neuer können Sie verwenden Files.move(from, to, CopyOption... options).

Z.B

Files.move(Paths.get("/foo.txt"), Paths.get("bar.txt"), StandardCopyOption.REPLACE_EXISTING);

Weitere Informationen finden Sie in der Dokumentation zu Dateien


1
habe eine java.nio.file.NoSuchFileException mit Files.move
zhuochen shen

5

Zum Verschieben einer Datei können Sie auch Jakarta Commons IOs verwenden FileUtils.moveFile verwenden

Bei einem Fehler IOExceptionwird ein ausgelöst. Wenn also keine Ausnahme ausgelöst wird, wissen Sie, dass die Datei verschoben wurde.



4

Fügen Sie einfach die Quell- und Zielordnerpfade hinzu.

Alle Dateien und Ordner werden vom Quellordner in den Zielordner verschoben.

    File destinationFolder = new File("");
    File sourceFolder = new File("");

    if (!destinationFolder.exists())
    {
        destinationFolder.mkdirs();
    }

    // Check weather source exists and it is folder.
    if (sourceFolder.exists() && sourceFolder.isDirectory())
    {
        // Get list of the files and iterate over them
        File[] listOfFiles = sourceFolder.listFiles();

        if (listOfFiles != null)
        {
            for (File child : listOfFiles )
            {
                // Move files to destination folder
                child.renameTo(new File(destinationFolder + "\\" + child.getName()));
            }

            // Add if you want to delete the source folder 
            sourceFolder.delete();
        }
    }
    else
    {
        System.out.println(sourceFolder + "  Folder does not exists");
    }

4

Java 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

    return fileToMove.renameTo(new File(targetPath));
}

Java 7 (mit NIO)

public boolean moveFile(String sourcePath, String targetPath) {

    boolean fileMoved = true;

    try {

        Files.move(Paths.get(sourcePath), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);

    } catch (Exception e) {

        fileMoved = false;
        e.printStackTrace();
    }

    return fileMoved;
}

2

Sie können ein externes Tool für diese Aufgabe ausführen (wie copyin Windows-Umgebungen). Um den Code portabel zu halten, gilt jedoch der folgende allgemeine Ansatz:

  1. Lesen Sie die Quelldatei in den Speicher
  2. Schreiben Sie den Inhalt in eine Datei am neuen Speicherort
  3. Löschen Sie die Quelldatei

File#renameTofunktioniert, solange sich Quell- und Zielspeicherort auf demselben Volume befinden. Persönlich würde ich es vermeiden, Dateien in verschiedene Ordner zu verschieben.


@BullyWiiPlaza: Lies den großen Haftungsausschluss in Thilos Antwort. Auf einigen Plattformen (z. B. Windows) ist es in vielerlei Hinsicht kaputt.
Andrew Bourgeois


1
Files.move(source, target, REPLACE_EXISTING);

Sie können das FilesObjekt verwenden

Lesen Sie mehr über Dateien


0

Schrieb diese Methode, um genau dies in meinem eigenen Projekt nur mit der Ersetzungsdatei zu tun, wenn darin Logik vorhanden ist.

// we use the older file i/o operations for this rather than the newer jdk7+ Files.move() operation
private boolean moveFileToDirectory(File sourceFile, String targetPath) {
    File tDir = new File(targetPath);
    if (tDir.exists()) {
        String newFilePath = targetPath+File.separator+sourceFile.getName();
        File movedFile = new File(newFilePath);
        if (movedFile.exists())
            movedFile.delete();
        return sourceFile.renameTo(new File(newFilePath));
    } else {
        LOG.warn("unable to move file "+sourceFile.getName()+" to directory "+targetPath+" -> target directory does not exist");
        return false;
    }       
}

0

Bitte versuchen Sie dies.

 private boolean filemovetoanotherfolder(String sourcefolder, String destinationfolder, String filename) {
            boolean ismove = false;
            InputStream inStream = null;
            OutputStream outStream = null;

            try {

                File afile = new File(sourcefolder + filename);
                File bfile = new File(destinationfolder + filename);

                inStream = new FileInputStream(afile);
                outStream = new FileOutputStream(bfile);

                byte[] buffer = new byte[1024 * 4];

                int length;
                // copy the file content in bytes
                while ((length = inStream.read(buffer)) > 0) {

                outStream.write(buffer, 0, length);

                }


                // delete the original file
                afile.delete();
                ismove = true;
                System.out.println("File is copied successful!");

            } catch (IOException e) {
                e.printStackTrace();
            }finally{
               inStream.close();
               outStream.close();
            }
            return ismove;
            }

1
Dies wäre robuster, wenn sich die closeAnweisungen in einem finallyBlock befinden oder wenn ein Try-with-Resources-Block verwendet wird.
MikaelF

Ich habe es geändert Jetzt sollte es in
Ordnung

0

Sie können dies versuchen .. saubere Lösung

Files.move(source, target, REPLACE_EXISTING);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.