アプリ版:「スタンプのみでお礼する」機能のリリースについて

サーバ側とクライアント側の2つのファイル保存フォルダの中を比較して、クライアント側に不足しているファイルをサーバからダウンロードするというプログラムを作成しています。
現時点では、両方のフォルダのパスを指定して、FileクラスのlistFilesによってフォルダ内の一覧情報を取得し、それぞれのフォルダ内のファイル名を比較して一致しない場合はそれをダウンロードするという方法で不足しているファイルを取得することができています。
しかし、ファイル内容が異なっているのにファイル名が同じであるときにそれをダウンロードできないという問題がでてきて困っています。もしファイル内容まで一致しているかどうか比較できる方法があったら教えてほしいです。
よろしくお願いします。

A 回答 (3件)

中身の丸々の比較は時間もかかるので、サイズと更新日の比較では如何でしょう?


File local;
File server;
if (( local.length() != server.length() )
|| ( local.lastModified() != server.lastModified() )) {
    違う
}
else {
    同じ
}
但し、ファイル管理情報をパッチして、タイムスタンプを偽装されたら判断できません。
しかし、通常業務範囲ではそこまで悪意のある事態を想定しなくても良いのでは?
    • good
    • 0
この回答へのお礼

お返事どうもありがとうございます。
サイズと更新日の比較は全然思いつきませんでした。
とても手軽に比較できそうで参考になります。
試作なので偽装とかそこまでは考えなくても大丈夫です。
プログラム例まで載せていただきありがとうございました。
またよろしくお願いします。

お礼日時:2010/01/27 17:53

メッセージダイジェスト(チェックサム)を取るのも


ひとつの手よね
    • good
    • 0

java.io.FileInputStreamクラスのオブジェクトを生成し、


比較元と比較先のファイルの内容をそれぞれbyte[]配列に取り、
それをjava.util.Arrays.equalsメソッドで比較するという方法はいかがでしょうか。
byte列同士の比較になるので、内容が完全に一致していなければ異なるファイルであると判定できると思います。
<例>
import java.io.*;
import java.util.*;
public class Sample {
public static void main(String[] args) {
try
{
File file1 = new File("比較元ファイルのpath");
File file2 = new File("比較先ファイルのpath");
byte[] b1 = new byte[(int)file1.length()];
byte[] b2 = new byte[(int)file2.length()];
new FileInputStream(file1).read(b1);
new FileInputStream(file2).read(b2);
System.out.println("Arrays.equals(b1, b2) => " + Arrays.equals(b1, b2));
}catch(FileNotFoundException e){
System.out.println(e);
}catch(IOException e){
System.out.println(e);
}catch(Exception e){
System.out.println(e);
}
}
}
※ただし、この方法は一旦配列に取得するという関係上、2,147,483,647byteより大きいサイズのファイルが来た時、正しく動作しません。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
自分が求めていた方法でした。
プログラム例まで載せていただきとても参考に
なります。
試作なのでファイルなどの軽いもので実行するので
サイズは大丈夫だと思います。

お礼日時:2010/01/27 18:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!