Java, File.renameTo()
здається, проблематична, особливо в Windows. Як сказано в документації API ,
Багато аспектів поведінки цього методу за своєю суттю залежать від платформи: Операція перейменування може не змогти перемістити файл з однієї файлової системи в іншу, вона може бути не атомною і не матиме успіху, якщо файл із цільовим абстрактним іменем шляху вже існує. Повернене значення завжди слід перевіряти, щоб переконатись, що операція перейменування була успішною.
У моєму випадку, як частину процедури оновлення, мені потрібно перемістити (перейменувати) каталог, який може містити гігабайти даних (безліч підкаталогів та файлів різного розміру). Переміщення завжди виконується в одному розділі / накопичувачі, тому немає реальної потреби фізично переміщувати всі файли на диску.
Не повинно бути жодних блокувань файлів до вмісту каталогу, який потрібно перемістити, але все ж досить часто функція renameTo () не виконує свою роботу і повертає false. (Я просто здогадуюсь, що, можливо, деякі блокування файлів дещо довільно закінчуються в Windows.)
На даний момент у мене є резервний метод, який використовує копіювання та видалення, але це відмовно, оскільки це може зайняти багато часу, залежно від розміру папки. Я також розглядаю можливість просто задокументувати той факт, що користувач може переміщати папку вручну, щоб уникнути очікування годинами. Але "Правильний шлях", очевидно, буде чимось автоматичним і швидким.
Отже, моє запитання полягає в тому, чи знаєте ви альтернативний, надійний підхід для швидкого переміщення / перейменування за допомогою Java у Windows , як із простим JDK, так і з якоюсь зовнішньою бібліотекою. Або якщо ви знаєте простий спосіб виявити та звільнити будь-які блокування файлів для даної папки та всього її вмісту (можливо, тисячі окремих файлів), це теж було б добре.
Редагувати : У цьому конкретному випадку, здається, ми впоралися з використанням, просто renameTo()
взявши до уваги ще кілька речей; див. цю відповідь .