Quanto a isto, Este post pode ser um bom ponto-de-partida.
eduveks
o Message Digest só vai servir para comparar o tamanho dos arquivos, e não se os arquivos são exatamente iguais… podem ter o mesmo tamanho, mas conteúdos diferentes…
acho q a única maneira é comparar byte a byte…
o q tu esta fazendo no if(equals) é comparar os Objetos em Java e não os Arquios em si…
o q sera preciso fazer é um while ou for, a ler byte a byte e comparar um com o outro…
edpittol
eduveks:
o Message Digest só vai servir para comparar o tamanho dos arquivos, e não se os arquivos são exatamente iguais… podem ter o mesmo tamanho, mas conteúdos diferentes…
acho q a única maneira é comparar byte a byte…
o q tu esta fazendo no if(equals) é comparar os Objetos em Java e não os Arquios em si…
o q sera preciso fazer é um while ou for, a ler byte a byte e comparar um com o outro…
vlw eduveks… vou tentar fazer isso e se nao funcionar posto o q fiz…
grato
edpittol
Consegui \o/
obrigados a todos q postaram neste topico
Marky.Vasconcelos
Se possível poste o código que conseguiu para futuras pesquisas
eduveks
Meu a solução é simples, dois whiles(um para cada arquivo) um dentro do outro listando byte a byte, com um if a comparar os bytes dos dois arquivos.
Isto para arquivos pequenos ok… agora arquivos com muitos MBs é loucura! O tempo e o processamento vai ser bem custoso
T
thingol
O que o Aldrin Leal disse (obter o MessageDigest de cada um dos arquivos e comparar) é na prática o melhor método de comparar arquivos. Ele pode ser usado, por exemplo, para determinar em seu HD quais arquivos são repetidos.
Digamos que você tenha um HD com um milhão de arquivos (isso não é impossível porque existem HDs de 500 GBs relativamente baratos). Quero preparar uma lista dos arquivos que estão repetidos. Vou mostrar que isso é relativamente rápido de fazer, e muito seguro.
Se você comparar um por um, pelos conteúdos, você precisaria de fazer (1.000.000 x 999.999) / 2 comparações, o que levaria um tempo realmente absurdo. Se levar 0.5 segundo para comparar dois arquivos (um HD muito rápido com arquivos muito pequenos), você levaria cerca de 7927 anos para fazer a comparação . Portanto essa não é a melhor maneira.
O que você deve fazer:
Crie uma tabela em que um dos campos seja o "message digest" (usualmente 16 ou 20 bytes; para ser mais rigoroso, você pode usar o SHA-512, que tem 64 bytes), e o outro o nome do arquivo. Deixe essa tabela ordenada pelo "message digest".
Varra todos os arquivos, calculando o "message digest" de cada um, e insira os valores obtidos na tabela.
Digamos que ler o arquivo e calcular seu "message digest" leve 0.5 segundo; isso dá 5 dias e 19 horas aproximadamente.
Agora inspecione a tabela, e veja quais são os arquivos com o mesmo "message digest". (Algo como "select nomearquivo, messagedigest from arquivos where count (messagedigest) > 1 group by messagedigest - meu SQL não é grande coisa mas você deve pegar a idéia).
Usualmente, com uma precisão muito grande, arquivos com o mesmo "message digest" têm conteúdos iguais (e a precisão é melhor para um message digest maior, por isso é que sugeri o SHA-512); mas se quiser ser mais rigoroso, você só precisa comparar o conteúdo dos arquivos com o mesmo "message digest" entre si, o que leva muito menos tempo que comparar todos contra todos.
T
thingol
Experimentei rodar este programa em alguns diretórios de meu HD e achei um monte de arquivos repetidos.
importjava.util.*;importjava.security.*;importjava.io.*;/** * * Esta classe lista um diretório (e seus subdiretórios), * e indica quais arquivos têm o mesmo "message digest". * Provavelmente arquivos com o mesmo "message digest" devem ter o mesmo tamanho. * Exemplo de compilação e uso (requer Java 5.0): * javac TesteComparacaoArquivos * java -cp . TesteComparacaoArquivos "c:\projetos" */classTesteComparacaoArquivos{privatestaticfinalStringMESSAGE_DIGEST="SHA-512";privateMessageDigestdigest;publicTesteComparacaoArquivos(){try{digest=MessageDigest.getInstance(MESSAGE_DIGEST);}catch(NoSuchAlgorithmExceptionex){ex.printStackTrace();}}privatevoidlistarRecursivamente(List<File>arquivos,Filediretorio){File[]diretoriosEArquivos=diretorio.listFiles();for(Filef:diretoriosEArquivos){if(f.isDirectory()){listarRecursivamente(arquivos,f);}else{arquivos.add(f);}}}privateStringtoHex(byte[]bytes){StringBuilderret=newStringBuilder();for(inti=0;i<bytes.length;++i){ret.append(String.format("%02X",(bytes[i]&0xFF)));}returnret.toString();}privateStringobterDigest(Filef)throwsIOException{digest.reset();DigestInputStreamdis=newDigestInputStream(newFileInputStream(f),digest);byte[]buffer=newbyte[1024];intnBytes;while((nBytes=dis.read(buffer))>0){}dis.close();returntoHex(digest.digest());}publicvoidlistarArquivosRepetidos(Filediretorio)throwsIOException{List<File>arquivos=newArrayList<File>();System.out.println("Listando os subdiretórios...");listarRecursivamente(arquivos,diretorio);SortedMap<String,List><File>>arquivosPorDigest=newTreeMap<String,List><File>>();// Criando a lista dos arquivos... System.out.printf("Analisando os %d arquivos...",arquivos.size());inti=0;longt=System.currentTimeMillis();for(Filef:arquivos){++i;if(i%10==0)System.out.print(".");StringhexDigest=obterDigest(f);List<File>arquivosComMesmoDigest=arquivosPorDigest.get(hexDigest);if(arquivosComMesmoDigest==null){arquivosPorDigest.put(hexDigest,arquivosComMesmoDigest=newArrayList<File>());}arquivosComMesmoDigest.add(f);}System.out.println();System.out.printf("Cada arquivo levou em média %.2f ms para ser processado%n",(double)(System.currentTimeMillis()-t)/arquivos.size());System.out.println("-------------");// Agora imprimindo a lista de arquivos repetidosSystem.out.println("Arquivos repetidos neste diretório e em seus subdiretórios:");System.out.println();booleanfound=false;for(Map.Entry<String,List<File>>entry:arquivosPorDigest.entrySet()){Stringdigest=entry.getKey();List<File>arquivosComMesmoDigest=entry.getValue();if(arquivosComMesmoDigest.size()>1){// arquivos repetidosfound=true;System.out.printf("%3d arquivos com mesmo digest: (%s)%n",arquivosComMesmoDigest.size(),digest);for(Filef:arquivosComMesmoDigest){System.out.println(" "+f.getAbsolutePath());}}}if(!found){System.out.println("Não foram encontrados arquivos repetidos.");}}/** Listando os arquivos repetidos do diretorio corrente e seus subdiretorios */publicstaticvoidmain(String[]args)throwsIOException{TesteComparacaoArquivostca=newTesteComparacaoArquivos();tca.listarArquivosRepetidos(newFile(args[0]));}}
Marky.Vasconcelos
Meu a solução é simples, dois whiles(um para cada arquivo) um dentro do outro listando byte a byte, com um if a comparar os bytes dos dois arquivos.
Isto para arquivos pequenos ok… agora arquivos com muitos MBs é loucura! O tempo e o processamento vai ser bem custoso
Eu não quero isso agora, mas assim como ele teve essa duvida, pode não ser o único e se alguém quiser saber vai ta aqui
para isso o fórum^^
R
ricardonerd
eu estou com essa dúvida, se puder postar o código, preciso fazer a comparação de palavras de 2 arquivos e cairia como uma luva, pois estou tendo dificuldades
lelodois
Ressuscitando…
Dependendo da necessidade de cada um, até compensa comparar o
file.lastModified() .
Abs
E
entanglement
Você quer comparar 2 arquivos pelas palavras como se fosse o utilitário 'diff" do Unix? (ou o WinMerge do Windows?) Se for isso, é um pouco chato, eu recomendaria, nesse caso, pegar a saída do utilitário ‘diff’