¿Cómo muevo un archivo de una ubicación a otra en Java?

95

¿Cómo se mueve un archivo de una ubicación a otra? Cuando ejecuto mi programa, cualquier archivo creado en esa ubicación se mueve automáticamente a la ubicación especificada. ¿Cómo sé qué archivo se mueve?

pmad
fuente
Primero pregunta cómo mover un archivo, luego dice que algunos archivos se mueven automáticamente. ¿Puedes aclarar tu pregunta ?.
Jaime Hablutzel

Respuestas:

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

File # renameTo hace eso (no solo puede cambiar el nombre, sino también moverse entre directorios, al menos en el mismo sistema de archivos).

Cambia el nombre del archivo indicado por este nombre de ruta abstracto.

Muchos aspectos del comportamiento de este método son inherentemente dependientes de la plataforma: es posible que la operación de cambio de nombre no pueda mover un archivo de un sistema de archivos a otro, que no sea atómico y que no tenga éxito si un archivo con el nombre de ruta abstracto de destino ya existe. Siempre se debe verificar el valor de retorno para asegurarse de que la operación de cambio de nombre fue exitosa.

Si necesita una solución más completa (como querer mover el archivo entre discos), consulte Apache Commons FileUtils # moveFile

Thilo
fuente
9
myFile.renameTo (new File ("/ the / new / place / newname.file"));
djangofan
4
Sí, no se limite a proporcionar el nuevo directorio principal. Y asegúrese de que el camino ya existe.
Thilo
2
Tenga en cuenta que myFileeste comando no actualiza la ruta del objeto . Entonces apuntará a un archivo que ya no está allí.
Evgeni Sergeev
1
@Sulemankhan: sí, también elimina el archivo. Realmente lo mueve en el sistema de archivos
leole
2
@JulienKronegg: Eso probablemente depende de su sistema operativo / sistema de archivos. Creo que en Linux puede mover (o eliminar) archivos que están abiertos actualmente (y continuar accediendo a ellos a través del identificador de archivos existente), pero no en Windows.
Thilo
63

Con Java 7 o más reciente puede usar Files.move(from, to, CopyOption... options).

P.ej

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

Consulte la documentación de Archivos para obtener más detalles.

micha
fuente
1
obtuve una java.nio.file.NoSuchFileException usando Files.move
zhuochen shen
5

Para mover un archivo, también puede usar Jakarta Commons IOs FileUtils.moveFile

En caso de error, arroja un IOException, por lo que cuando no se lanza ninguna excepción, sabrá que el archivo se movió.

DerMike
fuente
4

Simplemente agregue las rutas de las carpetas de origen y destino.

Moverá todos los archivos y carpetas de la carpeta de origen a la carpeta de destino.

    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");
    }
manjeet lama
fuente
4

Java 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

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

Java 7 (con 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;
}
Pranav VR
fuente
2

Puede ejecutar una herramienta externa para esa tarea (como copyen entornos de Windows) pero, para mantener el código portátil, el enfoque general es:

  1. leer el archivo de origen en la memoria
  2. escribir el contenido en un archivo en la nueva ubicación
  3. eliminar el archivo fuente

File#renameTofuncionará siempre que la ubicación de origen y de destino estén en el mismo volumen. Personalmente, evitaría usarlo para mover archivos a diferentes carpetas.

Andreas Dolk
fuente
@BullyWiiPlaza: lea el gran descargo de responsabilidad en la respuesta de Thilo. Está roto de muchas formas en algunas plataformas (por ejemplo, Windows).
AndrewBourgeois
2

Prueba esto :-

  boolean success = file.renameTo(new File(Destdir, file.getName()));
Opster Elasticsearch Pro-Vijay
fuente
2
Files.move(source, target, REPLACE_EXISTING);

Puedes usar el Filesobjeto

Leer más sobre archivos

Daniel Taub
fuente
0

Escribí este método para hacer esto mismo en mi propio proyecto solo con el archivo de reemplazo si existe lógica en él.

// 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;
    }       
}
Joel M
fuente
0

Por favor intente esto.

 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;
            }
Saranga kapilarathna
fuente
1
Esto sería más robusto si las closeinstrucciones estuvieran en un finallybloque, o si usara un bloque try-with-resources.
MikaelF
Lo he cambiado Ahora debería estar bien
Saranga kapilarathna
0

Puedes probar esta ... solución limpia

Files.move(source, target, REPLACE_EXISTING);
Saurabh Verma
fuente
Eso me dajavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico