Pessoal, preciso de uma ajuda pra copiar ou mover um diretório com todo seu conteúdo (subpastas + arquivos) para outro diretório.
Pesquisei na API, fórum e google, mas não achei nada que servisse.
Não é viável eu criar os diretórios e depois copiar os arquivos usando File, pois haverá casos em que a estrutura do diretório a ser copiado é muito grande.
Há algum método no java que copie diretórios?
Não há alguma coisa pronta. Se a quantidade de dados for muito grande (no caso do Windows), eu recomendaria usar o comando do Windows Resource Kit chamado “robocopy”. Esse comando é bem mais confiável que “arrastar e soltar” do Windows Explorer. Se o “robocopy” encontrar algum problema durante a cópia, é possível executar o comando de novo que ele continua de onde parou.
Vlw pela resposta. Não conheço esse comando. Pode dar um exemplo?
Achei algo a respeito. Vou ver se consigo implementar.
http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=1342
Se você digitá-lo sem parâmetros,
C:\Program Files\Windows Resource Kits\Tools>robocopy
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows :: Version XP010
-------------------------------------------------------------------------------
Started : Thu Feb 25 10:31:49 2010
Simple Usage :: ROBOCOPY source destination /MIR
source :: Source Directory (drive:\path or \\server\share\path).
destination :: Destination Dir (drive:\path or \\server\share\path).
/MIR :: Mirror a complete directory tree.
For more usage information run ROBOCOPY /? or read Robocopy.Doc.
NOTE: Read "True Replication" in Robocopy.Doc prior to first use of /MIR !
**** /MIR can DELETE files as well as copy them !
Há um .doc nesse mesmo diretório.
Um dos usos é a cópia simples e pura. Eu normalmente uso:
robocopy /v /e /z /r:1 /w:1 /eta origem destino
Você pode excluir alguns arquivos (por exemplo, se você não quer copiar arquivos .class, apenas .java, você pode usar o parâmetro /xf *.class
Outro uso é deixar 2 diretórios exatamente iguais, removendo os arquivos a mais que existem no diretório de destino. Use a opção /mir
[quote=Winthorp]Pessoal, preciso de uma ajuda pra copiar ou mover um diretório com todo seu conteúdo (subpastas + arquivos) para outro diretório.
Pesquisei na API, fórum e google, mas não achei nada que servisse.
Não é viável eu criar os diretórios e depois copiar os arquivos usando File, pois haverá casos em que a estrutura do diretório a ser copiado é muito grande.
Há algum método no java que copie diretórios?[/quote]
Mão. Você tem que implementar um método recursivo que copia. Veja que a copia de pastas implica na criação das pastas e depois na copia dos arquivos.
A copia dos arquivos em si tb não tem uma forma padrão para ser feita.
No caso do Unix, Linux etc., um “cp -R” já resolve.
Pessoal, estou quase conseguindo o que queria. Executo o comando através Runtime.getRuntime().exec(comando)
robocopy “origem” “destino” /mir --> esse comando, copia toda a estrutura de pastas para o destino, porém, se já houver arquivos no destino, ele apaga e copia os novos.
Isso é uma característica do próprio comando. “Delete destination files and directories that no longer exist in the source.”
/PURGE :: delete dest files/dirs that no longer exist in source.
/MIR :: MIRror a directory tree (equivalent to /E plus /PURGE).
O comando move não deleta o que já existe no destino, mas não está copiando a estrutura de pastas, somente arquivos.
Alguém que conheça melhor esse utilitário, sabe que parâmetros posso usar para não apagar o que já existe no destino?
Estou procurando, mas não achei nada ainda.
[quote]Um dos usos é a cópia simples e pura. Eu normalmente uso:
robocopy /v /e /z /r:1 /w:1 /eta origem destino[/quote]
Esse comando tb está apagando o que já existe no destino, ao invés de copiar os novos arquivos e pastas e manter o que já existe.
Espera um pouquinho.
Você não quer sobrepôr o que já existe?
É que esse comando não tem essa inteligência (de perguntar o que já existe, e renomear para um nome diferente caso já existir o tal arquivo).
Se você precisa de tal inteligência, então é necessário escrever um programa diferente mesmo.
[quote]Espera um pouquinho.
Você não quer sobrepôr o que já existe?[/quote]
Não é sobrepor, mas sim manter cópias anteriores já realizadas na pasta e acrescentar os novos.
Achei a combinação de parâmetros.
robocopy /move /e
Deleta a origem e mantém o que já existe no destino.
Agora vou testar se em uma nova cópia em que no destino exista um arquivo com o mesmo nome, aí sim deve sobrepor para ficar o mais novo.
Por enquanto, obrigado a todos pela ajuda. Se esse detalhe que irei testar funcionar, marco o post como RESOLVIDO.
É isso aí, quando tem um arquivo com o mesmo nome, ele é sobreposto mantendo o mais atualizado.
Obrigado pela ajuda.