フォルダ内にあるファイル全てを比較したい
以前よりこちらでファイル比較を相談していたものですが
ファイルNo.1~26までを比較するソフトは出来たのですが
状況によっては1~3までとか1,4,18とか飛ばし飛ばしに
ファイルがある場合があります。
その場合For文では無いファイル番号で比較が終わってしまい
次に進まないのですが、こういった時はどうしたらよいのでしょうか?
IF文なのかとも思いましたが、調べてもしっくりくるものが判らず
???だらけです。
どなた様か御教授御願い致します。
ちなみに下がファイル比較するソースになります。
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 While EXE.Status = 0
'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 25
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-30 14:36:19
Dim I&, F1$, F2$ '★←ここまでは以前と同じ
'★== FD側のファイルを列挙する ==
F1 = Dir("a:\*.DAT") 'A:\にある拡張子.DATのファイル全て
If F1 = "" Then '★該当ファイルが1個も無い場合
MsgBox "該当ファイルがありません"
Exit Sub
End If
'★== FD側のファイル名を記録する ==
I = -1 '最初は-1から
ReDim F(0) 'ファイル名を蓄える配列
Do
I = I + 1 '配列要素数(正しくは最大インデックス)を更新
ReDim Preserve F(I) = F1 '記録する
F1 = Dir '次のファイルを取得 ※パラメータ無しに注意
Loop Until F1 = "" '見つからなくなるまで繰り返す
'★== 記録したファイル名を逐次処理する ==
For Each F1 In F
F2 = "c:\VB\" & F1 'HD側のパス名
If Dir(F2) <> "" Then 'ファイルが存在する場合
F1 = "a:\" & F1 'FD側パス名
keka = Comp(F1, F2) 'ファイルを比較
Select Case keka '結果による振り分け
'★ === 中略 === ここは前のSelect Case と同じ
End Select
End If
Next
End Sub
今までの For I = 1 To 25 ~ Next は消去してください。
投稿日時 - 2009-01-30 18:13:19
nda23様
いつもありがとうございます。
御教授頂いたソースを試したところ
ReDim Preserve F(I) = F1 '記録する
で構文エラーと出てコンパイル出来ませんでした。
この場合何が原因なのでしょうか?
またI=-1となっておりますが、なぜ-1からはじめるのですか?
お暇な時にでも御回答頂けるとありがたいです。
投稿日時 - 2009-02-02 13:13:08
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(4)
いつもVBScriptなもので、ウッカリしておりました。
For Each F1 In F
F2 = "c:\VB\" & F1 'HD側のパス名
↓
For I = 0 To UBound(F) '★For Each を止めて、このように修正
F1 = F(I) '★インデックスで内容を取り出す
F2 = "c:\VB\" & F1 'HD側のパス名 '★←ここから以前のまま
投稿日時 - 2009-02-03 16:44:27
nda23様
いつもお世話になっております。
nda23様のおかげで当初の目的だった、変換後のファイル比較が
無事に完成致しました。
御指導頂きありがとうございます。
またご縁がありましたら宜しくお願い致します。
投稿日時 - 2009-02-03 17:09:56
ちょっと端折すぎました。
ReDim Preserve F(I) = F1 '記録する
↓
ReDim Preserve F(I) '配列を拡張する
F(I) = F1 '記録する
>なぜ-1からはじめるのですか
I = I + 1
ReDim F(I)
F(I) = F1 '最初のファイル名が格納される時、I=0にするため
配列の底が0なので、最初のファイル名をF(0)に格納するには拡張
した後のインデックスが0になっている必要があります。つまり、
+1して0になる整数と言えば-1ですね。
ReDimは配列を再定義する命令文で、ReDim Preserve F(I)とは
配列F(0)~F(I)までの(I+1)個の配列を再定義します。この時、
既に存在する部分をクリアせずに残しておくのがPreserve指定です。
投稿日時 - 2009-02-02 21:20:32
nda23様
御回答ありがとうございます。
御教授頂いたソースに変更したところ
For Eachを配列で使用する場合は、バリアント型の配列でなければいけません。
とエラーが出てしまいます。バリアント型にする必要がやはりあるのでしょうか?
また-1表記も理解できました。詳しい解説いつもありがとうございます。
投稿日時 - 2009-02-03 09:56:36
こんにちはte0000さん。
またしてもnda23です。
考え方は二通りあります。
(1)ファイルの存在を確認してから実行する。
(2)FDのフォルダにあるファイル名と同じ名前のファイルを
Cドライブの指定フォルダ内で探す。
(1)存在確認の方法ですが、簡単なのはDirメソッドです。
Dir("a:\W-NO-01.DAT") の戻り値が空文字列なら「存在しない」です。
例えば、こんな感じです。
If Dir(F1) = "" Or Dir(F2) = "" Then
keka = 0 'どちらか一方が存在しなければ等しかったことにする
Else
keka = Comp(F1, F2) '両方存在する場合のみ比較する
End If
(2)番号に関わらず、ファイルを列挙する場合もDirを使いますが、
列挙中は他の用途でDirを使ってはいけませんので、少し工夫が
必要です。この方法は別スレッドと言うことにしましょう。
投稿日時 - 2009-01-30 16:29:58
nda23様
毎度毎度御回答頂きありがとうございます。
早速上記試してみました。
上手くいき結果も良好でした。
お手数でなければ(2)の方法も御教授いただけますでしょうか。
勉強になります。
投稿日時 - 2009-01-30 16:39:14