Bagaimana cara memindahkan file dari satu lokasi ke lokasi lain di Java?

95

Bagaimana Anda memindahkan file dari satu lokasi ke lokasi lain? Ketika saya menjalankan program saya, file apa pun yang dibuat di lokasi itu secara otomatis berpindah ke lokasi yang ditentukan. Bagaimana saya tahu file mana yang dipindahkan?

pmad
sumber
Pertama Anda bertanya tentang cara memindahkan satu file, lalu Anda mengatakan bahwa beberapa file dipindahkan secara otomatis. Bisakah Anda membuat pertanyaan Anda lebih jelas ?.
Jaime Hablutzel

Jawaban:

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

File # renameTo melakukan itu (tidak hanya dapat mengganti nama, tetapi juga berpindah antar direktori, setidaknya pada sistem file yang sama).

Ubah nama file yang dilambangkan dengan nama jalur abstrak ini.

Banyak aspek perilaku metode ini secara inheren bergantung pada platform: Operasi penggantian nama mungkin tidak dapat memindahkan file dari satu sistem file ke sistem file lainnya, mungkin tidak bersifat atomik, dan mungkin tidak berhasil jika file dengan nama jalur abstrak tujuan sudah ada. Nilai yang dikembalikan harus selalu diperiksa untuk memastikan bahwa operasi penggantian nama berhasil.

Jika Anda memerlukan solusi yang lebih komprehensif (seperti ingin memindahkan file antar disk), lihat Apache Commons FileUtils # moveFile

Thilo
sumber
9
myFile.renameTo (File baru ("/ the / new / place / newname.file"));
djangofan
4
Ya, jangan hanya memberikan direktori induk baru. Dan pastikan jalur di sana sudah ada.
Thilo
2
Perhatikan bahwa jalur objek myFiletidak diperbarui dengan perintah ini. Jadi itu akan menunjuk ke file yang sudah tidak ada lagi.
Evgeni Sergeev
1
@Sulemankhan - ya, itu juga menghapus file. Ini benar-benar memindahkannya pada sistem file
leole
2
@JulienKronegg: Itu mungkin tergantung pada OS / sistem berkas Anda. Saya rasa di Linux Anda dapat memindahkan (atau menghapus) file yang saat ini terbuka (dan terus mengaksesnya melalui file handle yang ada), tetapi tidak di Windows.
Thilo
63

Dengan Java 7 atau yang lebih baru, Anda dapat menggunakan Files.move(from, to, CopyOption... options).

Misalnya

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

Lihat dokumentasi File untuk lebih jelasnya

micha
sumber
1
mendapat java.nio.file.NoSuchFileException menggunakan Files.move
zhuochen shen
5

Untuk memindahkan file, Anda juga dapat menggunakan Jakarta Commons IOs FileUtils.moveFile

Pada kesalahan itu melempar IOException, jadi ketika tidak ada pengecualian yang dilemparkan Anda tahu bahwa file tersebut telah dipindahkan.

DerMike
sumber
4

Cukup tambahkan jalur folder sumber dan tujuan.

Ini akan memindahkan semua file dan folder dari folder sumber ke folder tujuan.

    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
sumber
4

Jawa 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

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

Java 7 (Menggunakan 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
sumber
2

Anda dapat menjalankan alat eksternal untuk tugas itu (seperti copydi lingkungan windows) tetapi, untuk menjaga agar kode tetap portabel, pendekatan umumnya adalah:

  1. membaca file sumber ke dalam memori
  2. tulis konten ke file di lokasi baru
  3. hapus file sumber

File#renameToakan berfungsi selama sumber dan lokasi target memiliki volume yang sama. Secara pribadi saya akan menghindari menggunakannya untuk memindahkan file ke folder yang berbeda.

Andreas Dolk
sumber
@BullyWiiPlaza: baca penafian besar dalam jawaban Thilo. Ini rusak dalam banyak hal pada beberapa platform (misalnya Windows).
AndrewBourgeois
2

Coba ini :-

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

Anda bisa menggunakan Filesbenda itu

Baca lebih lanjut tentang File

Daniel Taub
sumber
0

Saya menulis metode ini untuk melakukan hal ini pada proyek saya sendiri hanya dengan mengganti file jika ada logika di dalamnya.

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

Silakan coba ini.

 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
sumber
1
Ini akan lebih kuat jika closeinstruksi berada dalam satu finallyblok, atau jika itu menggunakan blok coba-dengan-sumber daya.
MikaelF
Saya telah mengubahnya Sekarang seharusnya baik-baik saja
Saranga kapilarathna
0

Anda dapat mencoba ini .. solusi bersih

Files.move(source, target, REPLACE_EXISTING);
Saurabh Verma
sumber
Itu memberi sayajavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico