FolDiff


はじめに

特に複数の人間で, 共同でプログラムの開発をしている時など, 二つのディレクトリ (Windows だと「フォルダ」というんだっけ?) の中身を比較し, 更新・追加・削除されたファイルを知りたい時があります. 一応 windiff というプログラムが存在し可能なようですが ディレクトリの指定方法が貧弱で使い勝手が悪く使い物になりません.

そこで「ディレクトリを二つ指定し, 更新・追加・削除のリストを作成・表示する だけだったら, そんなに難しくないだろう」と作りだしたのが, 本プログラムのそもそもの始まりです. ところが人間の欲求というのは恐ろしいもので, それなりものもが出来てしまうと, 今度は「リスト部分をダブルクリックしたら windiff のように diff の結果が見れるようにしたい」と思うようになりました. 結局, おまけであるはずの 「diff の結果を表示する機能」の製作には, 本来の「更新・追加・削除リストの作成・表示機能」を作った時間の何倍も かかってしまいました.... .

使い方

実行形式はこいつです (2006.2 追記: zip で圧縮して置くようにしました). 無事起動できると下のようなダイアログが現れます (これは古いバージョンのものです).

使い方はまぁ特に説明するまでもないでしょう. 新ディレクトリと旧ディレクトリに, 比較したいディレクトリを指定し (指定方法は 1. 直接打つ, 2. [指定]ボタンを使う, 3. ドラッグアンドドロップ の三通りがあります), [開始]ボタンを押すとディレクトリの比較が始まります. すると下の方に結果が一覧表示されます.

一覧表示されているリストの中で [更新]と書かれたファイル名を ダブルクリックすると diff の結果が表示されます. また, [一覧表示]ボタンを押すとメモ帳などで結果を開くことができます.

なお, 追加と削除はタイムスタンプによる比較を行なっていません.

としています.

[設定] を押すと検索対象を指定することができます. デフォルトでは 「*」 : すなわち全ファイルが検索対象になっていますので, 必要に応じ『まず * を消し』 *.txt *.cpp *.h などを追加してください.

もう一つ, 「説明せんと分からんかもしれん」機能として diff 画面において 領域を選択してマウスの右ボタンを押すと, 「行コピー」と「領域コピー」の二つのメニューが現れます. このうち「領域コピー」は, 通常の Ctrl-V と同じで, 選択した部分すべてがクリップボードにコピーされます. 一方, 「行コピー」の方は選択した行の有効部分 (付加情報を除いた部分) を クリップボードにコピーします.

プログラムの中身

ディレクトリ比較において, ファイルが更新されたかどうかの判断は 1byte ずつ律義に比較しています. そのため, ファイルが多いと結果表示に時間がかかります.

ファイルの比較の方は, diff のアルゴリズムがエディットグラフの最小パスを検索するらしいということ ぐらいしか知らなかったのですが, なんとか適当に作ってみました. 車輪の再発明という気もしますが, できるだけ速く確実に動くにはどうすればいいか自分なりに工夫してみたつもりです (実はその過程がパズルを解いてるみたいで楽しかったりする). しかし, 残念ながら windiff に比べ結果が返ってくるのが遅いようです. 世の中より優れた diff アルゴリズムというのが存在するのでしょう.

ただ, 作った者の強みとして以下のようなことを胸を張って言うことができます (自慢にならんて...).

実は最近, 私は技巧に凝らず, プログラムのメンテナンス性と安全性に重点を置く プログラミングスタイルなんですが (まぁ当人がそう思っているだけですが... ), ファイル比較部分を作った当初, 大きなファイルだと動作があまりにも遅かったため, 久しぶりに技巧に走ったプログラムをしてしまいました.

という訳で, もしかしたら変なファイルを比較するとプログラムが落ちる可能性が あります. 万一そういう現象をみかけた方は, 作者まで御一報下さい.

裏話

実は最初, 本プログラムはディレクトリを比較する意味で DirDiff という名前で開発していました. ところが完成まじか, こちら の方に DirDiff.exe というアプリが存在していたことが判明し, フォルダを比較するという意味で FolDiff と改名しました. ちゃんちゃん.

2004.4 追記

2004 年 4 月, バージョンを 2 にしました. 旧バージョンと比較して 主な変更点は以下の通りです.

このマージディレクトリというのは, 新旧ディレクトリで比較した結果を別のディレクトリに反映させる際, ファイルのプロパティ表示やコピー, 上書きを行うためのものです.


[戻る]