Jak przenieść plik z jednej lokalizacji do drugiej w Javie?

98

Jak przenieść plik z jednej lokalizacji do drugiej? Kiedy uruchamiam program, każdy plik utworzony w tej lokalizacji jest automatycznie przenoszony do określonej lokalizacji. Skąd mam wiedzieć, który plik został przeniesiony?

pmad
źródło
Najpierw pytasz, jak przenieść jeden plik, a następnie mówisz, że niektóre pliki są przenoszone automatycznie. Czy możesz wyjaśnić swoje pytanie?
Jaime Hablutzel

Odpowiedzi:

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

File # renameTo to robi (może nie tylko zmieniać nazwę, ale także przemieszczać się między katalogami, przynajmniej w tym samym systemie plików).

Zmienia nazwę pliku oznaczonego tą abstrakcyjną nazwą ścieżki.

Wiele aspektów zachowania tej metody jest z natury zależnych od platformy: operacja zmiany nazwy może nie być w stanie przenieść pliku z jednego systemu plików na inny, może nie być atomowy i może się nie powieść, jeśli plik z docelową abstrakcyjną nazwą ścieżki już istnieje. Zawsze należy sprawdzać zwracaną wartość, aby upewnić się, że operacja zmiany nazwy zakończyła się pomyślnie.

Jeśli potrzebujesz bardziej kompleksowego rozwiązania (na przykład chcesz przenieść plik między dyskami), spójrz na Apache Commons FileUtils # moveFile

Thilo
źródło
9
myFile.renameTo (new File ("/ the / new / place / newname.file"));
djangofan,
4
Tak, nie podawaj tylko nowego katalogu nadrzędnego. I upewnij się, że ścieżka tam już istnieje.
Thilo
2
Zauważ, że myFileścieżka obiektu nie jest aktualizowana przez to polecenie. Więc będzie wskazywać na plik, którego już nie ma.
Evgeni Sergeev
1
@Sulemankhan - tak, usuwa również plik. Naprawdę przenosi to na system plików
leole
2
@JulienKronegg: To prawdopodobnie zależy od twojego systemu operacyjnego / systemu plików. Myślę, że w Linuksie można przenosić (lub usuwać) pliki, które są obecnie otwarte (i nadal uzyskiwać do nich dostęp przez istniejący uchwyt pliku), ale nie w systemie Windows.
Thilo
65

Dzięki Java 7 lub nowszej możesz używać Files.move(from, to, CopyOption... options).

Na przykład

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

Więcej informacji można znaleźć w dokumentacji plików

micha
źródło
1
dostałem java.nio.file.NoSuchFileException przy użyciu Files.move
zhuochen shen
5

Aby przenieść plik, możesz również użyć Jakarta Commons IOs FileUtils.moveFile

W przypadku błędu zgłasza an IOException, więc jeśli nie zostanie zgłoszony żaden wyjątek, wiesz, że plik został przeniesiony.

DerMike
źródło
4

Po prostu dodaj ścieżki folderów źródłowych i docelowych.

Przeniesie wszystkie pliki i folder z folderu źródłowego do folderu docelowego.

    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
źródło
4

Java 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

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

Java 7 (przy użyciu 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
źródło
2

Możesz wykonać zewnętrzne narzędzie do tego zadania (jak copyw środowiskach Windows), ale aby zachować przenośność kodu, ogólne podejście jest następujące:

  1. odczytać plik źródłowy do pamięci
  2. zapisz zawartość do pliku w nowej lokalizacji
  3. usuń plik źródłowy

File#renameTobędzie działać tak długo, jak długo źródło i lokalizacja docelowa będą na tym samym woluminie. Osobiście unikałbym używania go do przenoszenia plików do różnych folderów.

Andreas Dolk
źródło
@BullyWiiPlaza: przeczytaj duże zastrzeżenie w odpowiedzi Thilo. Na niektórych platformach (np. Windows) jest zepsuty na wiele sposobów.
AndrewBourgeois,
2

Spróbuj tego :-

  boolean success = file.renameTo(new File(Destdir, file.getName()));
Opster Elasticsearch Pro-Vijay
źródło
2
Files.move(source, target, REPLACE_EXISTING);

Możesz użyć Filesobiektu

Przeczytaj więcej o plikach

Daniel Taub
źródło
0

Napisałem tę metodę, aby zrobić to samo w moim własnym projekcie tylko z plikiem zastępowania, jeśli istnieje w nim logika.

// 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.
źródło
0

Spróbuj tego.

 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
źródło
1
Byłoby to bardziej niezawodne, gdyby closeinstrukcje znajdowały się w finallybloku lub gdyby używał bloku try-with-resources.
MikaelF
Zmieniłem to Teraz powinno być ok
Saranga kapilarathna
0

Możesz spróbować tego… czystego rozwiązania

Files.move(source, target, REPLACE_EXISTING);
Saurabh Verma
źródło
To daje mijavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico