2013-07-03 12 views
6

Jestem w trakcie automatyzacji serii działań, które wykonujemy bardzo dużo, aby zyskać trochę czasu. Obejmuje to przenoszenie plików i uruchamianie niektórych partii.Java 7 ATOMIC_MOVE podaje wyjątki

W tej konkretnej sytuacji próbuję skopiować plik z jednej lokalizacji do innej. Wszystko działa dobrze, dopóki nie spróbuję użyć opcji kopiowania ATOMIC_MOVE. To jest mój kod:

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); 
} 

Sprawdziłem i rozwiązano lokalizacje datafilePath i dropPath, są one poprawne. Próbowałem z 2 innymi standardowymi opcjami kopiowania, a program działa dobrze. Tylko dla ATOMIC_MOVE dostaję wyjątek UnsupportedOperationException. Nie jest tak, że absolutnie potrzebuję tej konkretnej opcji, ale jestem ciekawy, dlaczego nie pracowałbym. Nie mogę znaleźć żadnych innych raportów na ten temat. Robię to na komputerze z Windows 7.

Czy brakuje mi czegoś? A może ATOMIC_MOVE nie jest obsługiwany?

+0

Dlaczego próbujesz wykonać operację 'ATOMIC_MOVE' _copy_? To nie ma sensu. A może chcesz użyć 'link()'? – fge

+0

Jaki typ systemu plików próbujesz to zrobić? Być może operacja nie jest obsługiwana (http://docs.oracle.com/javase/tutorial/essential/io/move.html) –

+0

@fge Masz rację ... kiedy patrzysz na to w ten sposób, to nie ma sensu. Ale posiadanie opcji ATOMIC_MOVE w enumie o nazwie StandardCopyOption również nie ma większego sensu: /. Podkreślasz to ładnie, nie myślałem o tym w ten sposób. Na razie nie chcę tego używać, po prostu wypróbowałem to i nie udało mi się. Jestem zdziwiony, dlaczego to się nie uda. – anothernoc

Odpowiedz

14

Ponieważ interfejs API says, ATOMIC_MOVE nie jest obsługiwany dla copy(), ale tylko dla move().

+0

Dzięki! tęskniłem za tym. Skoncentrowałem się całkowicie na [tym] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html) – anothernoc

2

ATOMIC_MOVE służy do przenoszenia operacji, a nie kopiowania.

Z drugiej strony można tworzyć tak zwane "twarde linki" przy użyciu Files.createLink(). Istnieje również createSymbolicLink(), ale prawdopodobnie nie jest to, czego chcesz tutaj.

Oczywiście, .createLink() będzie działać tylko wtedy, gdy ścieżki źródłowe i docelowe znajdują się w tym samym systemie plików.

Powiązane problemy