プロが教える店舗&オフィスのセキュリティ対策術

VB6でHD内にあるデータとFD内にあるデータを
順番に比較したいと思っております。ファイル数は26個程で
形式はバイナリ形式のファイルです。
変換して出来たファイルをHDとFDにコピーしているのですが
FDにコピーしたファイルが書き込み不良等でたまにHD内のファイルと
違っています。
今はテキストエディターのファイル比較を手動で行なっておりますが
変換時に自動で比較できればと考えております。
どなたか御教授御願い致します。

A 回答 (5件)

先ずは安直に2個のファイル名を受け取り、比較する関数から


Function Comp(ByVal F1$, ByVal F2$) As Long
Dim EXE, STD, TXT$, CNT&
TXT = "FC /B " & F1 & " " & F2 'コマンドラインを形成
Set EXE = CreateObject("WScript.Shell").Exec(TXT) '実行
Set STD = EXE.StdOut '標準出力を取得
Do Until STD.AtEndOfStream '標準出力がEOFになるまでループ
  TXT = STD.ReadLine '標準出力から1行読み込む
  CNT = CNT + 1 '読み込み回数を数える
  If CNT = 2 Then Exit Do '2回目なら終了
Loop
If EXE.Status = 0 Then
  EXE.Terminate '未だ実行中なら強制終了する
  If TXT = "FC: 相違点は検出されませんでした" Then
    CNT = 0 '等しい場合
  Else
    CNT = 1 '等しくない場合
  End If
Else
  CNT = EXE.ExitCode '終了時は終了コードを得る
End If
STD.Close '標準出力を閉じる
Comp = CNT '戻り値を設定
End Function

この関数の戻り値:0=等しい / 1=等しくない / 2=入出力障害
但し、比較の度にコマンドプロンプトがチラチラする。これが
我慢ならない場合はAPIを使う高等技もあるが、とりあえずは
これを使ってみてください。
    • good
    • 0
この回答へのお礼

nda23様
度々のアドバイスありがとうございます。
記入頂いたソースを見ても何がどうなっているかピンとこない為
1から調べて理解したいと思います。

お礼日時:2008/12/12 13:16

>特に何も動作してくれません


この関数は比較結果を返すので、関数を呼び出した方が戻り値を
見てアクションしないと、何も起きません。以下はサンプルです。

Dim 結果 As Long
結果 = Comp("a:\W-NO-01.DAT", "c:\VB\W-NO-01.DAT")
Select Case 結果
  Case 0: MsgBox "二つのファイルの内容は等しい"
  Case 1: MsgBox "二つのファイルの内容は等しくない"
  Case 2: MsgBox "入出力障害を検出した"
End Select

あと、関数Comp内でF1、F2への代入はやめましょう。パラメータに
した意味がありませんから。
    • good
    • 0
この回答へのお礼

nda23様
度々の回答ありがとうございます。
お礼が遅くなった事お詫び申し上げます。

F1,F2への代入はやめた方が良いとありますが
どういった意味か考えたのですが理解出来ませんでした。
すいません。

基本的な事から勉強する必要を痛感しております。
ネット等でどなたか良いページを知っている方はおりませんでしょうか?
宜しくお願い致します。

お礼日時:2009/01/08 15:57

>F1$、F2$はファイル名と思いますが


そうです。正しくは「F1 As String」と記述します。"$"は文字型を
示す型記号です。(VB.NET以降は使えない)
>F1 = Dir("C:\vb\xx.dat")
こうすると、F1には"xx.dat"が代入されます。Dirは不要です。
>Byvalとは
「値渡し」という指定です。呼び出し元はパラメータのコピーを関数に
渡します。関数側でパラメータの内容を変更しても、呼び出し元の
変数が書き換わることはありません。これに対し、「参照渡し」という
方法があります。キーワードは"ByRef"です。省略時はこれです。
この場合、関数側で変数を変更すると、呼び出し元のデータも変更
されます。
今回は「パラメータは受け取るだけで、内容は変更しない」という
ことを明示的に表す目的で記述しました。
    • good
    • 0
この回答へのお礼

nda23様
度々の質問御回答頂き感謝しております。
下記のようにプログラムを組んだのですが
特に何も動作してくれません。何に問題があるのでしょうか?
御手数をお掛け致しますが、御指導御願い致します。

Option Explicit
'Private Sub Command1_Click()
Function Comp(ByVal F1$, ByVal F2$) As Long
Dim EXE, STD, TxT$, CNT&

F1 = ("a:\W-NO-01.DAT")
F2 = ("c:\VB\W-NO-01.DAT")

TxT = "FC /B" & F1 & " " & F2
Set EXE = CreateObject("WScript.Shell").Exec(TxT)
Set STD = EXE.StdOut
Do Until STD.AtEndOfStream
TxT = STD.ReadLine
CNT = CNT + 1
If CNT = 2 Then Exit Do
Loop
If EXE.Status = 0 Then
EXE.Terminate
If TxT = "FC: 相違点は検出されませんでした" Then
CNT = 0
Else
CNT = 1
End If
Else
CNT = EXE.ExitCode
End If
STD.Close
Comp = CNT
End Function

お礼日時:2008/12/16 09:57

少し解説しますね。


コマンドプロンプトでFCを使うと、以下のようになります。
FC /B C:\xx.bin C:\yy.bin
標準出力には先ず、開始メッセージが出力され、続いて相違箇所の
情報が出力されます。同じ場合は以下のメッセージが表示されます。
"FC: 相違点は検出されませんでした"
以下の3行はFCを実行させ、標準出力を取得します。
TXT = "FC /B " & F1 & " " & F2 '★コマンドを形成
Set EXE = CreateObject("WScript.Shell").Exec(TXT) '★FCを実行
Set STD = EXE.StdOut '★標準出力オブジェクトを獲得

ファイルサイズの不一致、入出力障害検出時は1行だけ出力され、
FCは終了し、標準出力はEOFになります。この場合はEXEのStatusが
1(終了)になっていますので、終了コードをそのまま戻り値に
しています。
Do Until STD.AtEndOfStream '★EOFならループ終了
If EXE.Status = 0 Then '★実行中
Else '★終了後
  CNT = EXE.ExitCode '★FCの終了コードを得る

また、比較が行われた場合、標準出力に2行出力された時点で
結果が分かるので、2行目を入力した時点でループを抜けます。
  If CNT = 2 Then Exit Do '★2行目を入力した場合は抜ける

ループから抜けた後で、未だ実行中なら時間節約のため、強制的に
FCを終了させます。
If EXE.Status = 0 Then '★実行中
  EXE.Terminate '★未だ実行中なので終了させる

強制終了の場合は大抵、不一致なのですが、念のため、2行目を
調べます。
  If TXT = "FC: 相違点は検出されませんでした" Then

Windows Scripting Host の技術を使っています。
http://msdn.microsoft.com/ja-jp/library/cc364455 …
    • good
    • 0
この回答へのお礼

nda23様
解説までして頂きありがとうございます。
何を実施しているかある程度理解出来ました。
ただ上の解説で理解出来たのでですが下記の
Function Comp(ByVal F1$, ByVal F2$) As Long
が理解出来ませんでした。申し訳ございません。
F1$、F2$はファイル名と思いますが、Byvalとは
どういった意味なのでしょうか?

またファイル設定はF1 = Dir("C:\vb\xx.dat")
という感じでよいのでしょうか?
調べれば調べるほど、迷宮に入っていって混乱しております。
どうか御教授御願い致します。

お礼日時:2008/12/15 17:08

「ファイルを開いてデータを読み込み比較する」というのが本筋だと


思いますが、FCコマンドの実行結果をVB6でチェックする方が速いかな
とも思います。本筋は「バイナリファイルの比較」などで検索すると
ヒットすると思います。FCコマンドもググれば使い方が出てます。
FCの実行のさせ方は以下のURLを見てください。
http://msdn.microsoft.com/ja-jp/library/cc364356 …
    • good
    • 0
この回答へのお礼

nda23様
御回答頂きありがとうございます。
FCコマンドという方法勉強になりました。
ただVB初心者なもので貼っていただいたURLを見ても
FCコマンドの実行のさせ方が判りませんでした。

もう少しググってみます。

お礼日時:2008/12/11 08:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!