Java'da bir dosyayı bir konumdan diğerine nasıl taşırım?


95

Bir dosyayı bir konumdan diğerine nasıl taşırsınız? Programımı çalıştırdığımda, bu konumda oluşturulan herhangi bir dosya otomatik olarak belirtilen konuma taşınır. Hangi dosyanın taşındığını nasıl bilebilirim?


Önce bir dosyanın nasıl taşınacağını sorarsınız, ardından bazı dosyaların otomatik olarak taşındığını söylersiniz. Sorunuzu daha net hale getirebilir misiniz?
Jaime Hablutzel

Yanıtlar:


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

Dosya # renameBunu yapar (yalnızca yeniden adlandırmakla kalmaz, aynı zamanda en azından aynı dosya sisteminde dizinler arasında da hareket edebilir).

Bu soyut yol adıyla gösterilen dosyayı yeniden adlandırır.

Bu yöntemin davranışının birçok yönü, doğası gereği platforma bağlıdır: Yeniden adlandırma işlemi bir dosyayı bir dosya sisteminden diğerine taşıyamayabilir, atomik olmayabilir ve hedef soyut yol adına sahip bir dosya varsa başarılı olmayabilir. zaten var. Yeniden adlandırma işleminin başarılı olduğundan emin olmak için dönüş değeri her zaman kontrol edilmelidir.

Daha kapsamlı bir çözüme ihtiyacınız varsa (dosyayı diskler arasında taşımak gibi), Apache Commons FileUtils # moveFile'a bakın


9
myFile.renameTo (yeni Dosya ("/ yeni / yer / yeniisim.dosyası"));
djangofan

4
Evet, sadece yeni ana dizini vermeyin. Ve oradaki yolun zaten var olduğundan emin olun.
Thilo

2
Nesnenin myFileyolunun bu komutla güncellenmediğini unutmayın. Yani artık orada olmayan bir dosyaya işaret edecek.
Evgeni Sergeev

1
@Sulemankhan - evet, dosyayı da siler. Onu gerçekten dosya sistemine taşır
leole

2
@JulienKronegg: Bu muhtemelen işletim sisteminize / dosya sisteminize bağlıdır. Sanırım Linux'ta şu anda açık olan (ve mevcut dosya tanıtıcısı aracılığıyla bunlara erişmeye devam eden) dosyaları taşıyabilir (veya silebilirsiniz), ancak Windows'ta değil.
Thilo

63

Java 7 veya daha yenisi ile kullanabilirsiniz Files.move(from, to, CopyOption... options).

Örneğin

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

Daha fazla ayrıntı için Dosyalar belgelerine bakın


1
Files.move kullanarak java.nio.file.NoSuchFileException aldı
zhuochen shen



4

Yalnızca kaynak ve hedef klasör yollarını ekleyin.

Tüm dosyaları ve klasörü kaynak klasörden hedef klasöre taşıyacaktır.

    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

Java 6

public boolean moveFile(String sourcePath, String targetPath) {

    File fileToMove = new File(sourcePath);

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

Java 7 (NIO Kullanarak)

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

Bu görev için harici bir araç çalıştırabilirsiniz ( copyWindows ortamlarında olduğu gibi ), ancak kodu taşınabilir tutmak için genel yaklaşım şudur:

  1. kaynak dosyayı hafızaya oku
  2. içeriği yeni konumdaki bir dosyaya yazın
  3. kaynak dosyayı sil

File#renameTokaynak ve hedef konum aynı birimde olduğu sürece çalışacaktır. Kişisel olarak, dosyaları farklı klasörlere taşımak için kullanmaktan kaçınırdım.


@BullyWiiPlaza: Thilo'nun cevabındaki büyük feragatnameyi okuyun. Bazı platformlarda (ör. Windows) birçok şekilde bozulur.
AndrewBourgeois


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

FilesNesneyi kullanabilirsiniz

Dosyalar hakkında daha fazlasını okuyun


0

Bu yöntemi, kendi projemde yalnızca mantık varsa değiştir dosyasıyla yapmak için yazdı.

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

Lütfen bunu deneyin.

 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
Bu, closetalimatlar bir finallyblokta olsaydı veya bir kaynaklarla deneme bloğu kullansaydı daha sağlam olurdu .
MikaelF

Bunu değiştirdim Şimdi tamam olmalı
Saranga kapilarathna

0

Bunu deneyebilirsin .. temiz çözümü

Files.move(source, target, REPLACE_EXISTING);

Bu bana verirjavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.