こんにちは!エンジニアの皆さん、Windows環境でのファイル比較(デフ)には何を使っていますか?
長年愛用されている定番の差分比較ツール「DF」。シンプルで軽快に動くので、ちょっとしたファイルの検証にめちゃくちゃ重宝しますよね。
しかし先日、このDFを使っているときに「背筋が凍るような奇妙な現象」に遭遇しました。
異変:ファイルサイズが違うのに「差異なし」と表示される
事の発端は、見た目も中身のテキストも全く同じはずの2つのファイルを比較したときのことです。
プロパティで見ると、ファイルサイズが明らかに数バイト違っている。 「あ、これは片方がWindowsの改行コード CRLF で、もう片方がLinuxの LF になっちゃってるな」とピンときました。
そこで、差分を確認するためにDFに2つのファイルを放り込んでみたのですが……画面に表示されたのは無情にもこの一言。
「ファイル内容は一致しています」
「えっ!? ファイルサイズが違うのに一致してるってどういうこと!?」と、自分の目を疑いました。
検証:DFはデフォルトで改行コードの違いを無視する?
気になって調べてみた(あるいは設定を見直してみた)のですが、どうやらDFはデフォルトの状態だと「改行コード(CRLF / LF / CR)の違いを検知せず、テキストの中身(文字列)だけで比較する」という挙動をするようです。
テキストファイルとして見れば「改行されている」という事実に変わりはないため、ツール側が気を利かせて「差分なし」と判定してくれているのでしょう。
普通に文章やソースコードのロジックを比較する分にはこの上なくありがたい親切機能なのですが、今回のように「環境移行に伴う改行コードの混在チェック」や「完全一致のバイナリ確認」をしたいときには、完全に裏目に出てしまう盲点でした……。
対策:改行コードも含めて厳密に比較したいときは?
もしDFを使っていて「改行コードの違いもちゃんと弾いてほしい!」という場合は、以下の対処が必要です。
-
設定を見直す: オプション設定の中に「改行コードの違いを無視する」といった類のチェック項目がないか確認し、あれば外す。
-
別のツールを使う: 改行コードの差異を視覚的にハッキリ表示してくれる「WinMerge(ウィンマージ)」や、バイナリ比較ができるツール、あるいはコマンドラインの
fcやdiffを使う。
まとめ:ツールの「親切機能」に足元をすくわれないように
「DFで一致したからヨシ!」とそのまま本番環境にファイルを投入していたら、システムが改行コードのせいで誤作動を起こすところでした。危ない危ない……。
ツールが優秀で親切だからこそ、こういう仕様の穴にハマると原因究明に時間がかかってしまいますね。
皆さんも「ファイルサイズが違うのにDFが『同じ』って言い張る!」という状況に遭遇したら、まずは改行コードの罠を疑ってみてください!
