Java File.renameTo()
é problemático, especialmente no Windows, ao que parece. Como diz a documentação da API ,
Muitos aspectos do comportamento deste 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ômico e pode não ter sucesso 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 foi bem-sucedida.
No meu caso, como parte de um procedimento de atualização, preciso mover (renomear) um diretório que pode conter gigabytes de dados (muitos subdiretórios e arquivos de tamanhos variados). A movimentação é sempre feita na mesma partição / unidade, então não há necessidade real de mover fisicamente todos os arquivos no disco.
Não deve haver nenhum bloqueio de arquivo para o conteúdo do diretório a ser movido, mas ainda, muitas vezes, renameTo () falha em fazer seu trabalho e retorna falso. (Estou apenas supondo que talvez alguns bloqueios de arquivo expirem um tanto arbitrariamente no Windows.)
Atualmente, tenho um método alternativo que usa copiar e excluir, mas isso é uma droga porque pode demorar muito , dependendo do tamanho da pasta. Também estou pensando em simplesmente documentar o fato de que o usuário pode mover a pasta manualmente para evitar esperar horas, potencialmente. Mas o Caminho Certo obviamente seria algo automático e rápido.
Portanto, minha pergunta é: você conhece uma abordagem alternativa e confiável para fazer uma rápida mudança / renomeação com Java no Windows , seja com JDK simples ou alguma biblioteca externa. Ou se você conhece uma maneira fácil de detectar e liberar qualquer bloqueio de arquivo para uma determinada pasta e todo o seu conteúdo (possivelmente milhares de arquivos individuais), também não há problema.
Edit : Neste caso específico, parece que escapamos usando apenas renameTo()
levando mais algumas coisas em consideração; veja esta resposta .