Java не удается переместить (переименовать) файл, когда результирующий файл находится в другой файловой системе
программа, которую мы ошиблись при попытке переместить файлы из одного каталога в другой. После долгой отладки я обнаружил ошибку, написав небольшую служебную программу, которая просто перемещает файл из одного каталога в другой (код ниже). Оказывается, при перемещении файлов в локальной файловой системе работает нормально, попытка переместить файл в другую файловую систему терпит неудачу.
Почему это? Вопрос может быть специфичным для платформы - мы запускаем Linux на ext3, если это имеет значение.
и второй вопрос; Должен ли я был использовать что-то еще, кроме renameTo()
метод File
класса? Кажется, что это работает только на локальных файловых системах.
тесты (Запуск от имени root):
touch /tmp/test/afile
java FileMover /tmp/test/afile /root/
The file move was successful
touch /tmp/test/afile
java FileMover /tmp/test/afile /some_other_disk/
The file move was erroneous
код:
import java.io.File;
public class FileMover {
public static void main(String arguments[] ) throws Exception {
boolean success;
File file = new File(arguments[0]);
File destinationDir = new File(arguments[1]);
File destinationFile = new File(destinationDir,file.getName() );
success = file.renameTo(destinationFile);
System.out.println("The file move was " + (success?"successful":"erroneous"));
}
}
4 ответов
Java 7 и выше
использовать Files.move(Path source, Path target, CopyOption... opts)
.
обратите внимание, что вы не должны предоставлять ATOMIC_MOVE
опция при перемещении файлов между файловыми системами.
Java 6 и ниже
из документации File.renameTo
:
[...] операция переименования может не быть в состоянии переместить файл из одной файловой системы в другую [...]
очевидным обходным путем было бы скопировать файл "вручную", открыв новый файл, запишите содержимое в файл и удалите старый файл.
вы также можете попробовать FileUtils.moveFile
метод из Apache Commons.
Javadoc на помощь:
многие аспекты поведения этого метода по сути зависит от платформы: операция переименования может быть не в состоянии двигаться файл из одной файловой системы в другую, он может быть не атомарным, и он возможно, не удастся, если файл с абстрактным путем назначения уже существует. Возвращаемое значение всегда должно быть проверено, чтобы убедиться что операция переименования прошла успешно.
отметим, что Класс Files определяет метод move для перемещения или переименования файл независимым от платформы способом.
документы:
переименовывает файл, обозначенный этим абстрактным путем.
многие аспекты поведения этого метода по сути зависит от платформы: операция переименования может быть не в состоянии двигаться файл из одной файловой системы в другую, он может быть не атомарным, и он возможно, не удастся, если файл с абстрактным путем назначения уже существует. Возвращаемое значение всегда должно быть проверено, чтобы убедиться что операция переименования был удачный.
Если вы хотите переместить файл между разными файловыми системами, вы можете использовать Apache moveFile
ваш ider является ошибкой потому /some_other_disk/ относительный URL, но URL-адрес полностью ,не могу найти URL-адрес у меня есть пример
Java FileMover D:\Eclipse33_workspace_j2ee\test\src\a\a.txt D:\Eclipse33_workspace_j2ee\test\src Перемещение файла прошло успешно
Java FileMover D:\Eclipse33_workspace_j2ee\test\src\a\a.txt \Eclipse33_workspace_j2ee\test\src
перемещение файла было ошибочным
результат-url-это ошибка