こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2009-01-13 14:04:28

QNo.4626881

困ってます

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

う~ん、何から説明しましょうか...

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 は余分ですから削除します。

投稿日時 - 2009-01-15 19:12:08

お礼

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

投稿日時 - 2009-01-16 14:18:45

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.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

投稿日時 - 2009-01-22 20:03:32

お礼

nda23様
いつもお世話になっております。
PCのスペックはCore2Duo 2.0GHz,WindowsXP SP3ですので
nda23様使用のPCと大差ないと思います。

もう一度プログラムを見直してみたいと思います。
ありがとうございます。

投稿日時 - 2009-01-23 15:19:52

ANo.7

予想通りの結果ですね。
どこも間違ってはいないのですが、そう言ってもしょうがないので、
以下のように修正してみましょう。
Do Until STD.AtEndOfStream → Do While EXE.Status = 0

それと、以下のメッセージが本当ならコーディングミスですね。
"a;\W-NO-01.DATとc:\VB\W-NO-01.DATの比較で入出力障害を検出した"
"a:"となるべきところが"a;"になってます。(見易いように
全角にしています。ドライブ指定がコロンでなくセミコロンです)
それでファイルが開かないのです。

コピペなら、こうならないハズなんだが・・・

とりあえず、コーディングミスを修正して実行し、それでもダメなら
Do文の修正を試みてください。

投稿日時 - 2009-01-22 13:55:18

お礼

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 を比較しています
********************************

また先程のお礼に書いた入力障害の記述はコピペではなく
手動で入力した為間違っておりました。申し訳ございません。

投稿日時 - 2009-01-22 17:29:18

ANo.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" のように打ち込んでも表示
させることができます。

投稿日時 - 2009-01-21 20:06:38

お礼

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のお礼に記述したソースはそのまま、コピペで貼っただけなのですが、何か変わってしまったのでしょうか。

投稿日時 - 2009-01-22 12:06:53

ANo.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)

投稿日時 - 2009-01-20 18:36:58

お礼

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の比較で入出力障害を検出した"となります。

これで何か判りますでしょうか。

投稿日時 - 2009-01-21 16:19:45

ANo.4

先ず間違いから
誤:TxT = "FC /B" & F1 & " " & F2
正:TxT = "FC /B " & F1 & " " & F2
/B の後ろに空白がないので、パス名(F1)がくっついてしまいます。

>01ファイルのみで実行が終了してしまう
せっかくFor 使ったのに、Exit For で抜けているじゃないですか。
サンプルでは等しい場合は何も表示せず、次々と処理を続けていき
ます。等しくないか、入出力障害の場合はメッセージを表示して、
処理を中断します。だから Exit For なんです。
まあ、好みなんで等しい時もメッセージ出して良いんですが、kekkaが
0 の時は Exit For するの止めましょうね。

投稿日時 - 2009-01-16 17:01:55

お礼

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

投稿日時 - 2009-01-20 16:47:33

ANo.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

投稿日時 - 2009-01-14 00:03:56

お礼

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

投稿日時 - 2009-01-14 16:38:53

ANo.1

単に成功したどうかなら RunメソッドでFC.EXEのリターンコードを取得した方が簡単なように思います

Set EXE = CreateObject("WScript.Shell")
' ウィンドウ非表示でFC.EXEが終了するまで待機
ret = EXE.run( TxT, 0, True )
として retが0なら同じ
1なら相違がある
2なら引数のファイルが開けなかった
-1なら引数が足らない
といった具合です ・・・

投稿日時 - 2009-01-13 15:34:27

お礼

redfox63様
御回答頂きありがとうございます。

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

投稿日時 - 2009-01-14 16:41:46

あなたにオススメの質問