お世話様です。
現在VB6(SP6)でファイル比較のアプリを作成しているのですが、
APIなどなかなか良い比較方法が無いので、DOSでFCコマンドを発行し
リダイレクトによって、その結果で判断しようとしましたが、
大きいバイナリファイルの場合はFCコマンドからリダイレクトへ膨大なデータ
をはき出す為、処理が帰って来ません(私の機では仮装メモリエラーになって
しまいました。)
そこで質問ですが・・・
1)他にサイズやタイムスタンプだけでなく、ファイルの中身で判断する方法
はご存じありませんか?
2)板違いかもしれませんが、FCコマンドで出力行数(例えば先頭の10行
のみを出力)の指定方法はご存じありませんか??
以上、宜しくお教え願えれば幸いです・・・
Dos窓でfc/?をやってみましたか?
>Dos窓でfc/?をやってみましたか?
はい。もちろんしました。
cmd="FC /A /B /C /T /U TestFile1.exe TestFile2.exe > Temp.txt"
Shell("cmd /c " & Cmd, vbHide)
でリダイレクトしています。
FCのヘルプも行数を指定するスイッチは見あたらないのですが・・・
LBnのスイッチは?
>LBnのスイッチは?
DOS窓で・・・
FC /A /B /C /T /U /LB10 TestFile1.exe TestFile2.exe
として試しましたが、大量に相違点が出力されます。
このLBスイッチは出力結果を指定行に制限出来るものなのでしょうか??
宜しくお教え下さいませ・・・
ねろ様・・度々すいません。
LBスイッチはアスキー比較のみに有効なのではないのでしょうか??
ややや! バイナリーファイルですね、
>例えば先頭の10行のみを出力
に惑わされた。(言い訳、本当はよく読まなかった)(^^;
バイナリーファイルには行の概念が無いので、スイッチの設定は出来ない。
FCじゃ無くて直接データーを読むしかないかな、同期処理は必要ですか?
>>例えば先頭の10行のみを出力
>に惑わされた。(言い訳、本当はよく読まなかった)(^^;
いえいえ、当方こそ、戸惑うような書き方、申し訳ありません。
>同期処理は必要ですか?
いえ、同期は必要ありません。「相違あり」「相違なし」のみでOKかと考えます。
確かにバイナリファイルをアスキー比較し、LBスイッチで出力結果を
制限出来るみたいですので、その辺も視野に詰めてみたいと思いますが、
何かウマい手がありましたら、お教え下さい。
>何かウマい手がありましたら、お教え下さい。
ウマい手と言われると困ってしまうのですが、やはり速度を速くするためには
Cでfseekを使ったDLLを作る位しか思いつきません。orz
リダイレクトなしで
結果だけなら
コマンドの終了コード
ECHO %ERRORLEVEL%で
わかるかな
あとはこれを
VBでとる方法を考えればいいかな
ねろ様、あん様、ご回答有り難うございます。
FCで比較すると、6MBのexeでもかなりの時間が必要なようです。(1〜2分)
やっぱり、DLL作成に取り組もうと考えております。
どうも、ご支援有り難うございました。m(__)m
compコマンドを使ってこんな手もありかもです。
@echo off
echo n|comp d:\testtexta.bin d:\testtextb.bin >d:\def.txt
ただ、比較対象にもよると思いますが判定だけなら
少し大きめなバッファを確保して普通にファイルをオープンして
比べたほうが早そうな気がします。違っていた段階で制御戻せますし。
数メガあるファイルで最後の1バイトのみ違うとなると、速度的には
厳しそうなので、ねろさんの
>ウマい手と言われると困ってしまうのですが、やはり速度を速くするためには
>Cでfseekを使ったDLLを作る位しか思いつきません。orz
にちょっと賛成です。
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
ツイート | ![]() |