Як перемістити файл з одного місця в інше на Java?


94

Як перемістити файл з одного місця в інше? Коли я запускаю програму, будь-який файл, створений у цьому місці, автоматично переміщується у вказане місце. Як дізнатися, який файл переміщено?


Спочатку ви запитуєте про те, як перемістити один файл, потім ви говорите, що деякі файли автоматично переміщуються. Чи можете ви зробити своє питання більш чітким ?.
Jaime Hablutzel

Відповіді:


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

Файл # перейменуватиЦе робить це (він може не тільки перейменовувати, але й переміщувати між каталогами, принаймні в тій же файловій системі).

Перейменовує файл, позначений цією абстрактною назвою шляху.

Багато аспектів поведінки цього методу за своєю суттю залежать від платформи: Операція перейменування, можливо, не зможе перемістити файл з однієї файлової системи в іншу, вона може бути не атомною, і це не вдасться, якщо файл із цільовим абстрактним іменем шляху вже існує. Повернене значення завжди слід перевіряти, щоб переконатись, що операція перейменування була успішною.

Якщо вам потрібно більш комплексне рішення (наприклад, бажання перемістити файл між дисками), подивіться на Apache Commons FileUtils # moveFile


9
myFile.renameTo (новий файл ("/ the / new / place / newname.file"));
djangofan

4
Так, не просто дайте новий батьківський каталог. І переконайтесь, що шлях вже існує.
Тіло

2
Зверніть увагу, що myFileця команда не оновлює шлях до об'єкта . Отже, це буде вказувати на файл, якого вже немає.
Євген Сергєєв

1
@Sulemankhan - так, він також видаляє файл. Це дійсно рухається у файловій системі
leole

2
@JulienKronegg: Це, ймовірно, залежить від вашої ОС / файлової системи. Я думаю, що в Linux ви можете переміщати (або видаляти) файли, які наразі є відкритими (і продовжувати отримувати до них доступ через наявний дескриптор файлів), але не у Windows.
Тіло

63

Ви можете використовувати Java 7 або новішу версію Files.move(from, to, CopyOption... options).

Напр

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

Докладніше див. У документації до файлів


1
отримав java.nio.file.NoSuchFileException за допомогою Files.move
zhuochen shen

5

Для переміщення файлу ви також можете використовувати Jakarta Commons IOs FileUtils.moveFile

При помилці він видає 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

Java 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

Ви можете виконати зовнішній інструмент для цього завдання (наприклад, copyу середовищі Windows), але, щоб зберегти код переносним, загальним підходом є:

  1. зчитування вихідного файлу в пам'ять
  2. записати вміст у файл у новому місці
  3. видалити вихідний файл

File#renameToбуде працювати, доки джерело та цільове розташування знаходяться на одному томі. Особисто я б уникав використовувати його для переміщення файлів до різних папок.


@BullyWiiPlaza: прочитайте великий застереження у відповіді Тіло. Це багато в чому порушено на деяких платформах (наприклад, Windows).
AndrewBourgeois,



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

Я змінив це. Тепер це повинно бути нормально
Саранга Капіларатна,

0

Ви можете спробувати це .. чисте рішення

Files.move(source, target, REPLACE_EXISTING);

Це дає меніjavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.