Alternativa File.renameTo () confiável no Windows?

Java'sFile.renameTo() é problemático, especialmente no Windows, parece. Enquanto oDocumentação da API diz:

Muitos aspectos do comportamento desse método são inerentemente dependentes da plataforma: A operação de renomeação pode não ser capaz de mover um arquivo de um sistema de arquivos para outro, pode não ser atômica e pode não ter êxito se um arquivo com o nome de caminho abstrato de destino já existe. O valor de retorno deve sempre ser verificado para garantir que a operação de renomeação seja bem-sucedida.

No meu caso, como parte de um procedimento de atualização, preciso mover (renomear) um diretório que possa conter gigabytes de dados (muitos subdiretórios e arquivos de tamanhos variados). A movimentação é sempre feita dentro da mesma partição / unidade, portanto não há necessidade real de mover fisicamente todos os arquivos no disco.

Lánão deveria Qualquer bloqueio de arquivo para o conteúdo do diretório a ser movido, mas ainda assim, muitas vezes, renameTo () não consegue fazer o seu trabalho e retorna false. (Estou apenas supondo que talvez alguns bloqueios de arquivos expirem arbitrariamente no Windows.)

Atualmente eu tenho um método de fallback que usa copiar e excluir, mas isso é uma droga, porque pode levarmuito de tempo, dependendo do tamanho da pasta. Eu também estou considerando simplesmente documentar o fato de que o usuário pode mover a pasta manualmente para evitar a espera por horas, potencialmente. Mas o Caminho Certo, obviamente, seria algo automático e rápido.

Então minha pergunta é:você conhece uma abordagem alternativa e confiável para fazer um movimento rápido / renomear com Java no Windows, com o JDK simples ou alguma biblioteca externa. Ou se você conhece umfácil maneira de detectar e liberar os bloqueios de arquivos para uma determinada pasta etodo o seu conteúdo (possivelmente milhares de arquivos individuais), isso seria ótimo também.

Editar: Neste caso particular, parece que nos safamos usando apenasrenameTo() levando mais algumas coisas em conta; Vejoesta resposta.

questionAnswers(14)

yourAnswerToTheQuestion