DOBON.NET DOBON.NETプログラミング掲示板過去ログ

バイナリでの比較

環境/言語:[C#、windowsXP、VS.NET2005]
分類:[.NET]

C#でファイル比較というのを行っているのですが、
処理的には、
ファイルの中身が同じならtrueを返し、違っていればfalseを返しています。
プログラムの詳細は、
a.txtとb.txtのファイルがあれば、
StreamReaderのReadToEndメソッドでshift-jisで全て取得し、
equalsメソッドで比較という形を取っています。
しかし、設計者からの指示ではバイナリ比較をしてくださいと言われています。
ファイルの比較でバイナリでの比較は出来るのでしょうか?
よろしくお願いします。
2007/04/26(Thu) 19:35:09 編集(投稿者)

> ファイルの比較でバイナリでの比較は出来るのでしょうか?

もちろん、そのようなコードを書けば実現可能です。

Windows にも、FC という、オプション指定でファイルのバイナリ比較を行うコマンドラインユーティリティが付属しています。
BinaryReader っていうのもありますが。


ここからは直接の回答ではありません。

とりあえずは、聞く前に MSDN を見てみるといいですよ。
人に聞くということは、他人様の貴重な時間と労力と知能を自分のために割いてい
ただいているということですから、どーーーーーーーーーーーーーっしてもわからない
という場合以外は、できるだけ自分でできることは自分でやってみるのがいいと思い
ます。

というわけで、MSDN を見てみるといいです。
例えば、StreamReader クラスを使って読み込むということがわかっているのであれ
ば、StreamReader を検索してみます。
StreamReader ってぐらいですから、ほにゃらら Reader もあるはずだと。
そうすると、一番下のその他の技術情報の欄に「基本のファイル I/O」というのがあ
るので、それを見てみればテキスト以外のファイル I/O について何か書いてあるか
もしれない、と想像がつくわけです。
基本のファイル I/O には、ストリームの読み取りと書き込みに使用されるクラスとい
う欄があり、それによれば StreamReader クラス以外にも BinaryReader だったり
StringReader だったり TextReader、そして Writer クラスなど、いろいろあることが
わかります。
そういった感じで調べていくと、他人様の手を煩わせることなく問題を解決できる上
に、自分の力で得た知識ということでなかなか忘れたりしない貴重なものになり得る
のではないでしょうか。

もちろん「そんな簡単なこと聞くなよwwww」とか言っているわけではなく、最初は誰
でも知らないこともあります。そういったときの「とっかかり」として調べ方を知っておく
といろいろと役に立つという話でした。
「バイナリ比較」であるならエンコーディングについて考える必要は無いわけで、Reader 系を持ち出すまでもなく、FileStream だけで十分かと。
ファイルの比較を行うとき、shift-jisで読み込んではいけません。
shift-jisにかかわらず、テキストファイルとして読み込んだ場合、
自動的になんらかの変換が行われることがあり、
オリジナル同士が異なっていたのに、偶然一致してしまうことがあります。

たとえば、文字の内容が同じでも、改行コードが違っていた場合、
テキストファイル的に両者は同じものですが、
実際は違うものですから、間違った結果を返してしまうことになります。

そもそも比較するファイルがshift-jisテキストとは限りませんし、
設計者の方はこの点を考慮して、バイナリ比較を要請されたのではないでしょうか?

具体的なコード例は以下のとおりです。

using System.IO;

public bool Compare(string path1, string path2)
{
using (FileStream fs1 = File.OpenRead(path1))
using (FileStream fs2 = File.OpenRead(path2))
{
if (fs1.Length != fs2.Length) return false;

while (fs1.Position < fs1.Length)
{
if (fs1.ReadByte() != fs2.ReadByte())
{
return false;
}
}
}
return true;
}
fishさん、詳しくありがとうございました。
詳しく書いてくださったおかげでうまくいきました。
その他のみなさんもありがとうございました。
すみません。
解決済みにチェックを入れ忘れました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板