File.renameTo()
Wygląda na to, że Java jest problematyczna, zwłaszcza w systemie Windows. Jak mówi dokumentacja API ,
Wiele aspektów zachowania tej metody jest z natury zależnych od platformy: operacja zmiany nazwy może nie być w stanie przenieść pliku z jednego systemu plików na inny, może nie być atomowy i może się nie powieść, jeśli plik z docelową abstrakcyjną nazwą ścieżki już istnieje. Zawsze należy sprawdzać zwracaną wartość, aby upewnić się, że operacja zmiany nazwy zakończyła się pomyślnie.
W moim przypadku w ramach procedury aktualizacji muszę przenieść (zmienić nazwę) katalog, który może zawierać gigabajty danych (wiele podkatalogów i plików o różnych rozmiarach). Przenoszenie jest zawsze wykonywane na tej samej partycji / dysku, więc nie ma potrzeby fizycznego przenoszenia wszystkich plików na dysku.
Nie powinno być żadnych blokad plików w zawartości katalogu do przeniesienia, ale wciąż dość często funkcja renameTo () nie wykonuje swojego zadania i zwraca wartość false. (Zgaduję tylko, że być może niektóre blokady plików wygasają nieco arbitralnie w systemie Windows.)
Obecnie mam metodę awaryjną, która wykorzystuje kopiowanie i usuwanie, ale to jest do bani, ponieważ może to zająć dużo czasu, w zależności od rozmiaru folderu. Rozważam również po prostu udokumentowanie faktu, że użytkownik może ręcznie przenieść folder, aby potencjalnie uniknąć czekania godzinami. Ale Właściwa Droga byłaby oczywiście czymś automatycznym i szybkim.
Moje pytanie brzmi więc, czy znasz alternatywne, niezawodne podejście do szybkiego przenoszenia / zmiany nazwy w Javie w systemie Windows , albo za pomocą zwykłego JDK, albo jakiejś zewnętrznej biblioteki. Lub jeśli znasz łatwy sposób na wykrycie i zwolnienie blokad plików dla danego folderu i całej jego zawartości (prawdopodobnie tysięcy pojedynczych plików), to też byłoby w porządku.
Edycja : w tym konkretnym przypadku wydaje się, że uniknęliśmy używania renameTo()
, biorąc pod uwagę kilka innych rzeczy; zobacz tę odpowiedź .