Como faço para mover um arquivo de um local para outro em Java?

91

Como você move um arquivo de um local para outro? Quando executo meu programa, qualquer arquivo criado naquele local é movido automaticamente para o local especificado. Como sei qual arquivo foi movido?

pmad
fonte
Primeiro você pergunta como mover um arquivo, depois diz que alguns arquivos estão sendo movidos automaticamente. Você pode deixar sua pergunta mais clara?
Jaime Hablutzel

Respostas:

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

File # renameTo faz isso (ele pode não apenas renomear, mas também mover entre diretórios, pelo menos no mesmo sistema de arquivos).

Renomeia o arquivo indicado por este nome de caminho abstrato.

Muitos aspectos do comportamento deste método são inerentemente dependentes da plataforma: A operação de renomeação pode não ser capaz de mover um arquivo de um sistema de arquivos para outro, pode não ser atômico e pode não ter sucesso se um arquivo com o nome de caminho abstrato de destino já existe. O valor de retorno deve sempre ser verificado para garantir que a operação de renomeação foi bem-sucedida.

Se você precisar de uma solução mais abrangente (como mover o arquivo entre discos), consulte Apache Commons FileUtils # moveFile

Thilo
fonte
9
myFile.renameTo (new File ("/ the / new / place / newname.file"));
djangofan 01 de
4
Sim, não forneça apenas o novo diretório pai. E verifique se o caminho já existe.
Thilo,
2
Observe que o myFilecaminho do objeto não é atualizado por este comando. Portanto, ele estará apontando para um arquivo que não está mais lá.
Evgeni Sergeev
1
@Sulemankhan - sim, ele também exclui o arquivo. Realmente o move no sistema de arquivos
leole de
2
@JulienKronegg: Isso provavelmente depende do seu SO / sistema de arquivos. Acho que no Linux você pode mover (ou excluir) arquivos que estão abertos no momento (e continuar a acessá-los por meio do identificador de arquivo existente), mas não no Windows.
Thilo
62

Com Java 7 ou mais recente, você pode usar Files.move(from, to, CopyOption... options).

Por exemplo

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

Veja a documentação do Files para mais detalhes

micha
fonte
1
obteve um java.nio.file.NoSuchFileException usando Files.move
zhuochen shen
5

Para mover um arquivo, você também pode usar Jakarta Commons IOs FileUtils.moveFile

Em caso de erro, ele lança um IOException, então, quando nenhuma exceção é lançada, você sabe que o arquivo foi movido.

DerMike
fonte
4

Basta adicionar os caminhos das pastas de origem e destino.

Ele moverá todos os arquivos e pastas da pasta de origem para a pasta 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
fonte
4

Java 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

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

Java 7 (usando 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
fonte
2

Você poderia executar uma ferramenta externa para essa tarefa (como copyem ambientes Windows), mas, para manter o código portátil, a abordagem geral é:

  1. leia o arquivo de origem na memória
  2. Grave o conteúdo em um arquivo no novo local
  3. exclua o arquivo de origem

File#renameTofuncionará desde que a origem e o local de destino estejam no mesmo volume. Pessoalmente, evito usá-lo para mover arquivos para pastas diferentes.

Andreas Dolk
fonte
@BullyWiiPlaza: leia o grande aviso na resposta de Thilo. Ele está quebrado de várias maneiras em algumas plataformas (por exemplo, Windows).
AndrewBourgeois,
2

Experimente isto: -

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

Você pode usar o Filesobjeto

Leia mais sobre Arquivos

Daniel Taub
fonte
0

Escrevi este método para fazer exatamente isso em meu próprio projeto apenas com o arquivo de substituição se houver lógica nele.

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

Por favor, tente isso.

 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
fonte
1
Isso seria mais robusto se as closeinstruções estivessem em um finallybloco ou se ele usasse um bloco try-with-resources.
MikaelF
Eu mudei agora deve estar ok
Saranga kapilarathna
0

Você pode tentar esta .. solução limpa

Files.move(source, target, REPLACE_EXISTING);
Saurabh Verma
fonte
Isso me dájavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico