Pessoal,
O método File.renameTo() do pacote java.io tem sérios erros e opera de forma distinta de acordo com a plataforma utilizada.
Alguns exemplos:
Em Windows substitui-se o arquivo de destino se o mesmo existir.
Em Solaris as função retorna false, pois, não é permitido a substituição do arquivo.
O método NÂO copia um arquivo de uma partição para outra no LINUX.
Estes e outros problemas são relatados no link abaixo pela própria SUN (é preciso estar logado):
http://developer.java.sun.com/servlet/SessionServlet?url=/developer/bugParade/bugs/4167147.html
Resumidamente:
Bug ID: 4167147
Votes 27
Synopsis (spec) java.io.File.renameTo: Clarify spec wrt. system dependencies
Category java:classes_io
Reported Against 1.2 , 1.2fcs
Release Fixed tiger-beta
State Closed, fixed
Related Bugs 4017593
Submit Date 18-AUG-1998
Description .
Clarify the specification of the renameTo method to say that its operation is
inherently system-dependent and that, in particular, it may or may not be
atomic and it may or may not succeed if a file or directory already exists
under the target name. – xxxxx@xxxxx 8/18/1998
Sugiro dois métodos: copiar e mover. Segue abaixo os criados por mim:
/*
*
* Copia Arquivo de um local para outro. Considerações:
* Se existir o arquivo de destino, este é sobreposto.
* Se não existir o diretório de destino, este é criado.
*
*/
public static int copiar(String original, String copia)
{
File origem = null;
File destino = null;
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try
{
origem = new File(original);
destino = new File(copia);
// cria diretorio se nao existir
if (!destino.getParentFile().exists())
destino.getParentFile().mkdirs();
if (destino.exists())
destino.delete();
fileOutputStream = new FileOutputStream(destino);
fileInputStream = new FileInputStream(origem);
byte[] buffer = new byte[8192];
for (int bytes = fileInputStream.read(buffer);
bytes >= 0;
bytes = fileInputStream.read(buffer))
{
fileOutputStream.write(buffer, 0, bytes);
}
fileOutputStream.flush();
return 1;
}
catch (Exception e)
{
System.out.println(
"GerenciaArquivo:copiar:Exception" + e.getMessage());
return 0;
}
finally
{
try
{
fileInputStream.close();
fileInputStream = null;
fileOutputStream.close();
fileOutputStream = null;
}
catch (IOException e1)
{
System.out.println(
"GerenciaArquivo:copiar:finally:Exception"
+ e1.getMessage());
}
}
}
public static int mover(String arquivoAntigo, String arquivoNovo)
{
File origem = null;
try
{
if (copiar(arquivoAntigo, arquivoNovo) == 1)
{
origem = new File(arquivoAntigo);
origem.delete();
return 1;
}
else
{
return 0;
}
}
catch (Exception e)
{
return 0;
}
}