2013-07-03 2 views
6

Я нахожусь в центре автоматизации серии действий, которые мы делаем много, чтобы получить некоторое время. Это включает в себя перемещение файлов и запуск нескольких партий.Java 7 ATOMIC_MOVE дает исключения

В этой конкретной ситуации я пытаюсь скопировать файл из одного места в другое. Все работает нормально, пока я не попытаюсь использовать параметр копирования ATOMIC_MOVE. Это мой код:

private void copyToDropFolder(Datafile datafile, String company) throws IOException{ 
    Path datafilePath = datafile.getDataPath(); 
    String dropFolder = locations.getLocationFor("default"); 
    Path dropPath = Paths.get(dropFolder, company.toUpperCase(),locations.getLocationFor("drop"), datafile.getFileName()); 
    Files.copy(datafilePath, dropPath, StandardCopyOption.ATOMIC_MOVE); 
} 

Я проверил и решил местоположение путь_файла_данного и dropPath, они оба действительны. Я попытался с двумя другими стандартными вариантами копирования, и программа работает нормально. Только для ATOMIC_MOVE я получаю исключение UnsupportedOperationException. Дело не в том, что мне абсолютно нужен этот конкретный вариант, но мне любопытно, почему я не буду работать. Я не могу найти другие отчеты по этой проблеме. Я делаю это на машине с Windows 7.

Я что-то упустил? Или ATOMIC_MOVE просто не поддерживается?

+0

Почему вы пытаетесь выполнить операцию 'ATOMIC_MOVE' _copy_? Это не имеет смысла. Или вы хотите использовать 'link()'? – fge

+0

Какой тип файловой системы вы пытаетесь включить? Возможно, операция не поддерживается (http://docs.oracle.com/javase/tutorial/essential/io/move.html) –

+0

@fge Вы правы ... когда вы смотрите на это таким образом, это не имеет смысла. Но наличие опции ATOMIC_MOVE в перечислении, называемом StandardCopyOption, не имеет особого смысла: /. Вы указываете, что это красиво, я так не думал об этом. На данный момент, я действительно не хочу использовать его, я просто попробовал, и он терпит неудачу. Я озадачен, почему он потерпит неудачу. – anothernoc

ответ

14

Как API says, ATOMIC_MOVE не поддерживается для copy(), но только для move().

+0

Спасибо! я пропустил это. Я полностью сосредоточился на [этом] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html) – anothernoc

2

ATOMIC_MOVE предназначен для операций перемещения, а не операций копирования.

С другой стороны, вы можете создать так называемые «жесткие ссылки», используя Files.createLink(). Существует также createSymbolicLink(), но это, вероятно, не то, что вы хотите здесь.

И, конечно, .createLink() будет работать только в том случае, если пути источника и назначения находятся в одной файловой системе.

Смежные вопросы