Come faccio a spostare un file da una posizione a un'altra in Java?


95

Come si sposta un file da una posizione a un'altra? Quando eseguo il programma, qualsiasi file creato in quella posizione si sposta automaticamente nella posizione specificata. Come faccio a sapere quale file viene spostato?


Prima chiedi come spostare un file, poi dici che alcuni file vengono spostati automaticamente. Puoi rendere la tua domanda più chiara?
Jaime Hablutzel

Risposte:


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

File # rename Per farlo (non solo può rinominare, ma anche spostarsi tra le directory, almeno sullo stesso file system).

Rinomina il file indicato da questo percorso astratto.

Molti aspetti del comportamento di questo metodo sono intrinsecamente dipendenti dalla piattaforma: l'operazione di ridenominazione potrebbe non essere in grado di spostare un file da un file system a un altro, potrebbe non essere atomico e potrebbe non riuscire se un file con il percorso astratto di destinazione esiste già. Il valore restituito dovrebbe essere sempre controllato per assicurarsi che l'operazione di ridenominazione sia stata eseguita correttamente.

Se hai bisogno di una soluzione più completa (come spostare il file tra i dischi), guarda Apache Commons FileUtils # moveFile


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

4
Sì, non dare solo la nuova directory principale. E assicurati che il percorso esista già.
Thilo

2
Notare che il myFilepercorso dell'oggetto non viene aggiornato da questo comando. Quindi punterà a un file che non è più lì.
Evgeni Sergeev

1
@Sulemankhan - sì, elimina anche il file. Lo sposta davvero sul file system
Leole

2
@JulienKronegg: probabilmente dipende dal tuo sistema operativo / filesystem. Penso che in Linux sia possibile spostare (o eliminare) i file attualmente aperti (e continuare ad accedervi tramite l'handle di file esistente), ma non su Windows.
Thilo

63

Con Java 7 o più recente puoi usare Files.move(from, to, CopyOption... options).

Per esempio

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

Vedere la documentazione di File per maggiori dettagli


1
ha ottenuto un java.nio.file.NoSuchFileException utilizzando Files.move
zhuochen shen

5

Per spostare un file puoi anche usare Jakarta Commons IOs FileUtils.moveFile

In caso di errore genera un IOException, quindi quando non viene generata alcuna eccezione sai che il file è stato spostato.



4

Basta aggiungere i percorsi della cartella di origine e di destinazione.

Sposterà tutti i file e le cartelle dalla cartella di origine alla cartella di destinazione.

    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 (utilizzando 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

È possibile eseguire uno strumento esterno per quell'attività (come copynegli ambienti Windows) ma, per mantenere il codice portatile, l'approccio generale è:

  1. legge il file sorgente in memoria
  2. scrivere il contenuto in un file nella nuova posizione
  3. eliminare il file di origine

File#renameTofunzionerà fintanto che la posizione di origine e di destinazione si trovano sullo stesso volume. Personalmente eviterei di usarlo per spostare file in cartelle diverse.


@BullyWiiPlaza: leggi il grande disclaimer nella risposta di Thilo. È rotto in molti modi su alcune piattaforme (ad esempio Windows).
Andrew Bourgeois


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

Puoi usare l' Filesoggetto

Ulteriori informazioni sui file


0

Ho scritto questo metodo per fare proprio questa cosa sul mio progetto solo con il file di sostituzione se esiste la logica in esso.

// 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

Per favore prova questo.

 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
Questo sarebbe più robusto se le closeistruzioni fossero in un finallyblocco o se usasse un blocco try-with-resources.
MikaelF

L'ho cambiato Ora dovrebbe essere ok
Saranga kapilarathna

0

Puoi provare questa .. soluzione pulita

Files.move(source, target, REPLACE_EXISTING);

Questo mi dàjavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.