• ベストアンサー

再質問 ファイル比較について

VB5.0を使用しております。初心者で解らない事だらけの為質問を致します。 FD内のデータとHD内にあるファイル26個を順に比較したいのですが 以前質問して下記プログラムを組んでみたのですが 動作しているかも判りません。 どなたか解説及び添削を御願い致します。 やりたい事は、データ変換をして出来たファイルをFDとHD内にバックアップとしてコピーをしています。そのデータを1ファイルずつ比較し問題が無いか確認したいのです。以前よりFDにコピーした際に、書き込み不良が発生し使用出来ない事があった為です。 御手数をお掛け致しますが、宜しくお願い致します。 作成したプログラム '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 Dim keka As Long keka = Comp("a:\W-NO-01.DAT", "c:\VB\W-NO-01.DAT") Select Case keka Case 0: MsgBox "二つのファイルの内容は等しい" Case 1: MsgBox "二つのファイルの内容は等しくない" Case 2: MsgBox "入出力障害を検出した" End Select End Function

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

う~ん、何から説明しましょうか... Option Explicit ~ (最初の)End Function はこのままで良いです。 その後、Dim I&, F1$, F2$ の行以下を全て削除してください。 それで、とりあえず実行できるでしょう。 Dim I&, F1$, F2$ 以下は、Command1_Click() の中のCompを呼び 出している部分を置き換えるためのコードです。 keka = Comp("a:\W-NO-01.DAT", "c:\VB\W-NO-01.DAT") のように 固定で書いてしまうと、1対のファイルしか比較できないでしょ? でも、比較したいファイルは26対あるんですよね。それで、For文で ループしながら26対の比較を順次、実行しようという意図です。 もし、ファイル名が"W-NO-01.DAT"、"W-NO-02.DAT"、"W-NO-03.DAT" のようになっているとしての話ですが・・・ なので、最終的には Command1_Click() は以下のようになります。 Private Sub Command1_Click()   Dim keka As Long   Dim I&, F1$, F2$   For I = 1 To 26     F1 = "a:\W-NO-" & Format(I, "00") & ".DAT"     F2 = "c:\VB\W-NO-" & Format(I, "00") & ".DAT"     keka = Comp(F1, F2)     Select Case keka       Case 1:         MsgBox F1 & "と" & F2 & "は等しくない"         Exit For       Case 2:         MsgBox F1 & "と" & F2 & "の比較で入出力障害を検出した"         Exit For     End Select   Next End Sub あと、一番最後の End Function は余分ですから削除します。

te0000
質問者

お礼

nda23様 毎度毎度ありがとうございます。 上記回答を頂く前に、関数について勉強し 大体同じようなソースまで行き着きました。 ただ実行したのですが、01ファイルのみで実行が終了してしまうのと 同じ内容のファイルを比較させたのですが、 等しく有りませんとなってしまいます。 まだ何か問題があるのでしょうか? 御教授頂けませんでしょうか。 ↓今回のソースです。 Option Explicit Function Comp(ByVal F1$, ByVal F2$) As Long Dim EXE, STD, TxT$, CNT&, I&  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 Private Sub Command1_Click() Dim keka As Long Dim I&, F1$, F2$ For I = 1 To 26   F1 = "a:\W-NO-" & Format(I, "00") & ".DAT"   F2 = "c\VB\W-NO-" & Format(I, "00") & ".DAT"   keka = Comp(F1, F2)   Select Case keka    Case 0:     MsgBox F1 & "と" & F2 & " は等しい"    Exit For    Case 1:     MsgBox F1 & "と" & F2 & "は等しくない"    Exit For    Case 2:     MsgBox F1 & "と" & F2 & "の比較で入出力障害を検出した"    Exit For   End Select  Next End Sub

その他の回答 (7)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.8

マシン、OSのスペックが低いせいではないでしょうか。 私の場合はPentium(R)D 2.8GHz、WindowsXP SP3,または Core2Duo 2.4GHz、WindowsXP SP3です。また、実行環境は Excel.VBA、及びVB6.0です。(微妙にVB環境が違うが・・・) それと、ここに記載されたものと実際のコーディングが少し違う のでは?今回、Debug.Printが二重になっただけですよね? 同じ内容が繰り返されているだけですから。これと、前回が異なる 所は STD.AtEndOfStream がFalseになっていることです。これが 正しい結果であり、前回のTrueは異常な結果です。 プログラムミス、OSが古い、マシンが遅いの何れかで下記★の所へ 行ってしまうんでしょうね。あと、デバッグモードで1行ずつ実行 しているとか・・・ だけど、ミスの可能性が90%くらいなので、Debug.Printを元に戻して みてください。 If TxT = "FC: 相違点は検出されませんでした" Then     CNT = 0 Else     CNT = 1 '★ここへ来ると戻り値=1なので、「等しくない」 End If

te0000
質問者

お礼

nda23様 いつもお世話になっております。 PCのスペックはCore2Duo 2.0GHz,WindowsXP SP3ですので nda23様使用のPCと大差ないと思います。 もう一度プログラムを見直してみたいと思います。 ありがとうございます。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.7

予想通りの結果ですね。 どこも間違ってはいないのですが、そう言ってもしょうがないので、 以下のように修正してみましょう。 Do Until STD.AtEndOfStream → Do While EXE.Status = 0 それと、以下のメッセージが本当ならコーディングミスですね。 "a;\W-NO-01.DATとc:\VB\W-NO-01.DATの比較で入出力障害を検出した" "a:"となるべきところが"a;"になってます。(見易いように 全角にしています。ドライブ指定がコロンでなくセミコロンです) それでファイルが開かないのです。 コピペなら、こうならないハズなんだが・・・ とりあえず、コーディングミスを修正して実行し、それでもダメなら Do文の修正を試みてください。

te0000
質問者

お礼

nda23様 早速の御回答ありがとうございます。 Do Until STD.AtEndOfStream → Do While EXE.Status = 0 変更したのですが、等しくないとなってしまいます。 そこで Debug.Print EXE.Status '★←この行を追加する。 Debug.Print STD.AtEndOfStream '★←この行を追加する。 Debug.Print CNT, TxT '★←この行を追加する。 を追加したところ正しく比較して等しい結果が出ました。 これはなぜなのでしょうか? ちなみにイミディエイトには以下の表示が出ました。 ******************************** 0 False 0 ファイル A:\W-NO-01.DAT と C:\VB\W-NO-01.DAT を比較しています 0 False 0 ファイル A:\W-NO-02.DAT と C:\VB\W-NO-02.DAT を比較しています ******************************** また先程のお礼に書いた入力障害の記述はコピペではなく 手動で入力した為間違っておりました。申し訳ございません。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.6

No.4の「お礼」にある通りに作られていませんね。 Do Until STD.AtEndOfStream ~ Loop はプログラムが終了して、標準出力がEOFになるか(Until条件)、 標準出力に2行目の出力が行われる(CNT = 2)までループします。 >If CNT = 2 Then Exit Do Loopの外側でブレークした時、CNTが1というのはあり得ないです。 以下のように状態と標準出力をモニタしてください。 TxT = STD.ReadLine Debug.Print EXE.Status '★←この行を追加する。 Debug.Print STD.AtEndOfStream '★←この行を追加する。 Debug.Print CNT, Txt '★←この行を追加する。 CNT = CNT + 1 1ループにつき、イミディエイト・ウィンドウに3行の情報が 表示されるでしょう。この結果をお知らせください。尚、変数や プロパティを参照する時はローカルウィンドウでも良いのですが、 イミディエイトウィンドウで"? CNT" のように打ち込んでも表示 させることができます。

te0000
質問者

お礼

nda23様 いつも御回答頂きありがとうございます。 上記行を追加した結果は以下になりました。 結果 ******************************** 0 True 0 ファイル A:\W-NO-01.DAT と C\VB\W-NO-01.DAT を比較しています ******************************** ただ動作させたところ "a;\W-NO-01.DATとc:\VB\W-NO-01.DATの比較で入出力障害を検出した" となってしまいました。 No.4のお礼に記述したソースはそのまま、コピペで貼っただけなのですが、何か変わってしまったのでしょうか。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

このソースを当方で実行しましたが、正しい結果になりました。 以下の所にブレークポイントを置いて、停止した時の値を調べて ください。 == 前略 == If EXE.Status = 0 Then   EXE.Terminate   If TxT = "FC: 相違点は検出されませんでした" Then '★ここ     CNT = 0   Else     CNT = 1   End If Else   CNT = EXE.ExitCode '★ ここ End If (1)最初のポイントで停止した場合  TxTの内容 (2)2番目のポイントで停止した場合  1ステートメントだけ実行し、CNTの値(=EXE.ExitCode)

te0000
質問者

お礼

nda23様 お世話になっております。 ブレイクポイントで停められたのですが、TxTの内容が 何所に出てくるか判りませんでした。 ローカルウインドウ内で良いのでしょうか? (1)でブレークポイントで停めた時はローカルウインドウでは TxT "ファイル A:\W-NO-01.DATとC:\VB\W-NO-01.DATを比較しています" と出てきます。 その時のCNTは1です。 (2)でブレーク使用としますが停まりませんでした。 停まらない時は"a:\W-NO-01.DATとc:\VB\W-NO-01.DATは等しくない" とMsgBoxに表示されます。 停まった時に1ステートメントだけ実行するとCNTは2になり 最後まで実行すると"a:\W-NO-01.DATとc:\VB\W-NO-01.DATの比較で入出力障害を検出した"となります。 これで何か判りますでしょうか。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

先ず間違いから 誤:TxT = "FC /B" & F1 & " " & F2 正:TxT = "FC /B " & F1 & " " & F2 /B の後ろに空白がないので、パス名(F1)がくっついてしまいます。 >01ファイルのみで実行が終了してしまう せっかくFor 使ったのに、Exit For で抜けているじゃないですか。 サンプルでは等しい場合は何も表示せず、次々と処理を続けていき ます。等しくないか、入出力障害の場合はメッセージを表示して、 処理を中断します。だから Exit For なんです。 まあ、好みなんで等しい時もメッセージ出して良いんですが、kekkaが 0 の時は Exit For するの止めましょうね。

te0000
質問者

お礼

nda23様 いつもありがとうございます。 ご指摘ありましたスペースやExit Forを抜いて確認しているのですが やはりファイルが等しくありませんと出てしまいます。 コマンドプロンプトで直にFCコマンドを入力すると相違点はありません となります。 何か間違いがあるのでしょうか? FCコマンドを入力して出てくる結果が "ファイル A:\W-NO-01.DAT と C:\VB\W-NO-01.DAT を比較しております FC: 相違点は検出されませんでした" となっているからでしょうか? 毎度毎度御手数をお掛けし申し訳ございませんが、宜しくお願い致します。 今回修正したソース↓ Option Explicit Function Comp(ByVal F1$, ByVal F2$) As Long Dim EXE, STD, TxT$, CNT&, I& 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 Private Sub Command1_Click() Dim keka As Long Dim I&, F1$, F2$ For I = 1 To 26 F1 = "a:\W-NO-" & Format(I, "00") & ".DAT" F2 = "c\VB\W-NO-" & Format(I, "00") & ".DAT" keka = Comp(F1, F2) Select Case keka Case 1: MsgBox F1 & "と" & F2 & "は等しくない" Exit For Case 2: MsgBox F1 & "と" & F2 & "の比較で入出力障害を検出した" Exit For End Select Next End Sub

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

以前回答したnda23です。 ★ボタンをクリックした時のイベントプロシージャ Private Sub Command1_Click()   Dim keka As Long   keka = Comp("a:\W-NO-01.DAT", "c:\VB\W-NO-01.DAT") '←比較する   Select Case keka '←結果に応じた処理の振り分け     Case 0: MsgBox "二つのファイルの内容は等しい"     Case 1: MsgBox "二つのファイルの内容は等しくない"     Case 2: MsgBox "入出力障害を検出した"   End Select End Sub ★比較処理 Function Comp(ByVal F1$, ByVal F2$) As Long '== 中略 == Comp = CNT End Function 【解説】 Command1ボタンをクリックすると比較を行い、結果に応じたメッセージを表示します。 ファイルが26個あるなら、正しくは以下のようになると思います。 Dim I&, F1$, F2$ For I = 1 To 26   F1 = "a:\W-NO-" & Format(I, "00") & ".DAT"   F2 = "c:\VB\W-NO-" & Format(I, "00") & ".DAT"   keka = Comp(F1, F2)   Select Case keka     Case 1:       MsgBox F1 & "と" & F2 & "は等しくない"       Exit For     Case 2:       MsgBox F1 & "と" & F2 & "の比較で入出力障害を検出した"       Exit For   End Select Next

te0000
質問者

お礼

nda23様 いつも御回答頂きありがとうございます。 上記順に記述するという事なのでしょうか? 下記プログラムですと Function Comp(ByVal F1$, ByVal F2$) As Longで ”End Sub,End FunctionまたはEnd Property以降には、コメントのみが記述できます。” とエラーが発生致します。 何が悪いのでしょうか? 今回記述したソース Option Explicit Private Sub Command1_Click() Dim keka As Long keka = Comp("a:\W-NO-01.DAT", "c:\VB\W-NO-01.DAT") '←比較する Select Case keka '←結果に応じた処理の振り分け Case 0: MsgBox "二つのファイルの内容は等しい" Case 1: MsgBox "二つのファイルの内容は等しくない" Case 2: MsgBox "入出力障害を検出した" End Select End Sub Function Comp(ByVal F1$, ByVal F2$) As Long Dim EXE, STD, TxT$, CNT&, I& 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 Dim I&, F1$, F2$ For I = 1 To 26 F1 = "a:\W-No-" & Format(I, "00") & ".DAT" F2 = "c\VB\W-NO-" & Format(I, "00") & ".DAT" keka = Comp(F1, F2) Select Case keka Case1: MsgBox F1 & "と" & F2 & "は等しくない" Exit For Case 2: MsgBox F1 & "と" & F2 & "の比較で入出力障害を検出した" Exit For End Select Next End Function

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

単に成功したどうかなら RunメソッドでFC.EXEのリターンコードを取得した方が簡単なように思います Set EXE = CreateObject("WScript.Shell") ' ウィンドウ非表示でFC.EXEが終了するまで待機 ret = EXE.run( TxT, 0, True ) として retが0なら同じ 1なら相違がある 2なら引数のファイルが開けなかった -1なら引数が足らない といった具合です ・・・

te0000
質問者

お礼

redfox63様 御回答頂きありがとうございます。 回答頂いたソースは質問をした時に記述してあるソースに 追加するのでしょうか? 基本的なことを質問し申し訳ありません。

関連するQ&A