Java에서 파일을 한 위치에서 다른 위치로 어떻게 이동합니까?


96

한 위치에서 다른 위치로 파일을 어떻게 이동합니까? 프로그램을 실행하면 해당 위치에서 생성 된 모든 파일이 지정된 위치로 자동으로 이동합니다. 어떤 파일이 이동되었는지 어떻게 알 수 있습니까?


먼저 하나의 파일을 이동하는 방법에 대해 질문 한 다음 일부 파일이 자동으로 이동한다고 말합니다. 질문을 더 명확하게 할 수 있습니까?.
Jaime Hablutzel

답변:


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

File # renameTo 는이를 수행합니다 (이름을 바꿀 수있을뿐만 아니라 적어도 동일한 파일 시스템에서 디렉토리 사이를 이동할 수도 있습니다).

이 추상 경로 이름으로 표시된 파일의 이름을 바꿉니다.

이 방법의 동작의 많은 측면은 본질적으로 플랫폼에 따라 다릅니다. 이름 바꾸기 작업은 한 파일 시스템에서 다른 파일 시스템으로 파일을 이동할 수없고 원 자성이 아닐 수 있으며 대상 추상 경로 이름을 가진 파일이있는 경우 성공하지 못할 수 있습니다. 이미 존재 함. 반환 값은 항상 이름 바꾸기 작업이 성공했는지 확인해야합니다.

보다 포괄적 인 솔루션이 필요한 경우 (예 : 디스크간에 파일을 이동하려는 경우) Apache Commons FileUtils # moveFile을 참조하십시오.


9
myFile.renameTo (new File ( "/ the / new / place / newname.file"));
djangofan 2011 년

4
예, 새 상위 디렉토리를 제공하지 마십시오. 그리고 거기에 경로가 이미 있는지 확인하십시오.
Thilo 2011 년

2
개체 myFile경로는이 명령으로 업데이트되지 않습니다. 따라서 더 이상 존재하지 않는 파일을 가리 킵니다.
Evgeni Sergeev 2014

1
@Sulemankhan-예, 파일도 삭제합니다. 정말 파일 시스템에 이동
leole

2
@JulienKronegg : 아마도 OS / 파일 시스템에 따라 다릅니다. Linux에서는 현재 열려있는 파일 (기존 파일 핸들을 통해 계속 액세스)을 이동 (또는 삭제) 할 수 있지만 Windows에서는 사용할 수 없다고 생각합니다.
Thilo

64

Java 7 이상에서는 Files.move(from, to, CopyOption... options).

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

자세한 내용은 파일 문서를 참조하십시오.


1
Files.move를 사용하여 java.nio.file.NoSuchFileException이 발생했습니다
zhuochen shen

5

파일을 이동하려면 Jakarta Commons IOs FileUtils.moveFile을 사용할 수도 있습니다.

오류가 발생하면을 throw IOException하므로 예외가 발생하지 않으면 파일이 이동되었음을 알 수 있습니다.



4

소스 및 대상 폴더 경로를 추가하기 만하면됩니다.

소스 폴더에서 대상 폴더로 모든 파일과 폴더를 이동합니다.

    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

자바 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

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

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

copyWindows 환경에서 와 같이 해당 작업에 대해 외부 도구를 실행할 수 있지만 코드를 이식 가능하게 유지하려면 일반적인 접근 방식은 다음과 같습니다.

  1. 소스 파일을 메모리로 읽습니다.
  2. 새 위치의 파일에 내용 쓰기
  3. 소스 파일 삭제

File#renameTo소스 및 대상 위치가 동일한 볼륨에있는 한 작동합니다. 개인적으로 파일을 다른 폴더로 옮기는 데 사용하는 것을 피하고 싶습니다.


@BullyWiiPlaza : Thilo의 답변에서 큰 면책 조항을 읽으십시오. 일부 플랫폼 (예 : Windows)에서는 여러 가지 방식으로 손상됩니다.
AndrewBourgeois 2015 년


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

Files개체를 사용할 수 있습니다.

파일 에 대해 자세히 알아보기


0

이 방법을 작성하여 내 프로젝트에서 기존 논리가있는 경우 대체 파일로만이 작업을 수행했습니다.

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

이것을 시도하십시오.

 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
close명령어가 finally블록에 있거나 try-with-resources 블록을 사용한 경우 더 강력합니다 .
MikaelF

나는 그것을 변경했습니다 이제 괜찮을 것입니다
Saranga kapilarathna

0

시도해볼 수 있습니다 .. 깨끗한 솔루션

Files.move(source, target, REPLACE_EXISTING);

그게 나에게javax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.