VBでのファイル比較


ほねほね  2005-08-30 01:29:22  No: 91866

お世話様です。
現在VB6(SP6)でファイル比較のアプリを作成しているのですが、
APIなどなかなか良い比較方法が無いので、DOSでFCコマンドを発行し
リダイレクトによって、その結果で判断しようとしましたが、
大きいバイナリファイルの場合はFCコマンドからリダイレクトへ膨大なデータ
をはき出す為、処理が帰って来ません(私の機では仮装メモリエラーになって
しまいました。)
そこで質問ですが・・・
1)他にサイズやタイムスタンプだけでなく、ファイルの中身で判断する方法
はご存じありませんか?
2)板違いかもしれませんが、FCコマンドで出力行数(例えば先頭の10行
のみを出力)の指定方法はご存じありませんか??

以上、宜しくお教え願えれば幸いです・・・


ねろ  2005-08-30 01:54:08  No: 91867

Dos窓でfc/?をやってみましたか?


ほねほね  2005-08-30 02:00:19  No: 91868

>Dos窓でfc/?をやってみましたか?
はい。もちろんしました。
cmd="FC /A /B /C /T /U TestFile1.exe TestFile2.exe > Temp.txt"
Shell("cmd /c " & Cmd, vbHide)
でリダイレクトしています。
FCのヘルプも行数を指定するスイッチは見あたらないのですが・・・


ねろ  2005-08-30 02:06:36  No: 91869

LBnのスイッチは?


ほねほね  2005-08-30 02:17:24  No: 91870

>LBnのスイッチは?
DOS窓で・・・
FC /A /B /C /T /U /LB10 TestFile1.exe TestFile2.exe 
として試しましたが、大量に相違点が出力されます。
このLBスイッチは出力結果を指定行に制限出来るものなのでしょうか??
宜しくお教え下さいませ・・・


ほねほね  2005-08-30 02:20:27  No: 91871

ねろ様・・度々すいません。
LBスイッチはアスキー比較のみに有効なのではないのでしょうか??


ねろ  2005-08-30 02:36:29  No: 91872

ややや!  バイナリーファイルですね、
>例えば先頭の10行のみを出力
に惑わされた。(言い訳、本当はよく読まなかった)(^^;
バイナリーファイルには行の概念が無いので、スイッチの設定は出来ない。
FCじゃ無くて直接データーを読むしかないかな、同期処理は必要ですか?


ほねほね  2005-08-30 02:41:27  No: 91873

>>例えば先頭の10行のみを出力
>に惑わされた。(言い訳、本当はよく読まなかった)(^^;
いえいえ、当方こそ、戸惑うような書き方、申し訳ありません。
>同期処理は必要ですか?
いえ、同期は必要ありません。「相違あり」「相違なし」のみでOKかと考えます。
確かにバイナリファイルをアスキー比較し、LBスイッチで出力結果を
制限出来るみたいですので、その辺も視野に詰めてみたいと思いますが、
何かウマい手がありましたら、お教え下さい。


ねろ  2005-08-30 03:04:06  No: 91874

>何かウマい手がありましたら、お教え下さい。
ウマい手と言われると困ってしまうのですが、やはり速度を速くするためには
Cでfseekを使ったDLLを作る位しか思いつきません。orz


あん  2005-08-30 03:10:08  No: 91875

リダイレクトなしで
結果だけなら
コマンドの終了コード
ECHO %ERRORLEVEL%で
わかるかな
あとはこれを
VBでとる方法を考えればいいかな


ほねほね  2005-08-30 03:45:18  No: 91876

ねろ様、あん様、ご回答有り難うございます。
FCで比較すると、6MBのexeでもかなりの時間が必要なようです。(1〜2分)
やっぱり、DLL作成に取り組もうと考えております。
どうも、ご支援有り難うございました。m(__)m


uud  2005-08-30 04:30:35  No: 91877

compコマンドを使ってこんな手もありかもです。
@echo off
echo n|comp d:\testtexta.bin d:\testtextb.bin >d:\def.txt

ただ、比較対象にもよると思いますが判定だけなら
少し大きめなバッファを確保して普通にファイルをオープンして
比べたほうが早そうな気がします。違っていた段階で制御戻せますし。

数メガあるファイルで最後の1バイトのみ違うとなると、速度的には
厳しそうなので、ねろさんの
>ウマい手と言われると困ってしまうのですが、やはり速度を速くするためには
>Cでfseekを使ったDLLを作る位しか思いつきません。orz
にちょっと賛成です。


ほねほね  2005-08-30 16:52:40  No: 91878

uud様、ご回答有り難うございます。
>compコマンドを使ってこんな手もありかもです。
>@echo off
>echo n|comp d:\testtexta.bin d:\testtextb.bin >d:\def.txt
私もCompでの比較も検討(?)したのですが、プロンプトでユーザ入力待ち
になってしまうので、諦めていたのですが、echo n|でNoが発行できるんですね。
勉強になりました。
ただ、Compの場合Windows98等のCommand.comにはCompがありませんので
その辺でFCかなぁ・・・と思っていました。
どうも、有り難うございました。m(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加