Попытка переименовать файл в Java не работает (с помощью метода java.io.File.renameTo) - PullRequest
0 голосов
/ 22 октября 2018

У меня есть метод, при котором я загружаю файл, делаю некоторые изменения и затем сохраняю его снова.Однако в качестве гарантии исключения во время сохранения я создаю новый файл и сначала сохраняю в него (поскольку неправильно отформатированные данные могут вызвать исключение в процессе сохранения).После завершения сохранения я удаляю исходный файл и переименовываю новый, чтобы получить имя оригинала.

Код выглядит в основном так:

MyDataClass.save(tempfile);
originalfile.delete();
tempfile.renameTo(originalfile);

Проблема заключается в том, что вызов метода renameTo всегда возвращает значение false, а новый файл (временный файл) остаетсясо случайным именем, с которым он был создан (исходный файл удален ).

Кто-нибудь может догадаться, почему переименование не удается?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

См. Files.move для более новых классов Path, Paths и Files.

MyDataClass.save(tempfile);
Files.move(tempfile.toPath(), originalfile.toPath(),
    StandardCopyOption.REPLACE_EXISTING,
    StandardCopyOption.ATOMIC_MOVE);

Это, конечно, предполагает, что save правильно закрыл временный файл.

0 голосов
/ 23 октября 2018

Я наконец выяснил проблему.Дело в том, что я использовал Apache POI (Microsoft Excel Library), и он не будет сохранять обновления, как следует.Попытка сохранить в существующий файл вызвала исключения, поэтому я решил сохранить второй файл, а затем удалить оригинальный / переименовать новый.Оказывается, однако, что сам акт сохранения этого в новый файл также заставляет это сохранять в оригинальный файл !!Поэтому мне просто нужно сохранить во временный файл, а затем удалить его ...

0 голосов
/ 22 октября 2018

Я полагаю, это может быть из-за того, что программа не может проверить недавний статус удаления файла.Вы можете отладить это, попробовав следующий код:

MyDataClass.save(tempfile);
if(originalfile.delete()==true){
tempfile.renameTo(originalfile);
}
else{
System.out.println("File is not deleted");
}

Или вы можете попробовать это.

MyDataClass.save(tempfile);
originalfile.delete();
Thread.sleep(4000);//Make the thread sleep so that the recent status can be detected
tempfile.renameTo(originalfile);

Кроме того, я вижу, что вы использовали MyDataClass.save для сохранения файла,Проверьте, не закрыли ли вы файл после сохранения.

Если файл заблокирован при попытке переименования, он может не работать

Кроме того, если вы используете проводник Windows для просмотра ваших файлов, возможно, вы захотите обновить, чтобы увидеть недавно созданный файл

...