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

解決済みの質問

フォルダ内にあるファイル全てを比較したい

以前よりこちらでファイル比較を相談していたものですが
ファイル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

QNo.4674148

困ってます

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

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

ANo.2

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

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

回答(4)

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

ANo.3

ちょっと端折すぎました。
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

ANo.1

こんにちは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

あなたにオススメの質問