No.2ベストアンサー
- 回答日時:
先ずは安直に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を使う高等技もあるが、とりあえずは
これを使ってみてください。
nda23様
度々のアドバイスありがとうございます。
記入頂いたソースを見ても何がどうなっているかピンとこない為
1から調べて理解したいと思います。
No.5
- 回答日時:
>特に何も動作してくれません
この関数は比較結果を返すので、関数を呼び出した方が戻り値を
見てアクションしないと、何も起きません。以下はサンプルです。
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への代入はやめましょう。パラメータに
した意味がありませんから。
nda23様
度々の回答ありがとうございます。
お礼が遅くなった事お詫び申し上げます。
F1,F2への代入はやめた方が良いとありますが
どういった意味か考えたのですが理解出来ませんでした。
すいません。
基本的な事から勉強する必要を痛感しております。
ネット等でどなたか良いページを知っている方はおりませんでしょうか?
宜しくお願い致します。
No.4
- 回答日時:
>F1$、F2$はファイル名と思いますが
そうです。正しくは「F1 As String」と記述します。"$"は文字型を
示す型記号です。(VB.NET以降は使えない)
>F1 = Dir("C:\vb\xx.dat")
こうすると、F1には"xx.dat"が代入されます。Dirは不要です。
>Byvalとは
「値渡し」という指定です。呼び出し元はパラメータのコピーを関数に
渡します。関数側でパラメータの内容を変更しても、呼び出し元の
変数が書き換わることはありません。これに対し、「参照渡し」という
方法があります。キーワードは"ByRef"です。省略時はこれです。
この場合、関数側で変数を変更すると、呼び出し元のデータも変更
されます。
今回は「パラメータは受け取るだけで、内容は変更しない」という
ことを明示的に表す目的で記述しました。
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
No.3
- 回答日時:
少し解説しますね。
コマンドプロンプトで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 …
nda23様
解説までして頂きありがとうございます。
何を実施しているかある程度理解出来ました。
ただ上の解説で理解出来たのでですが下記の
Function Comp(ByVal F1$, ByVal F2$) As Long
が理解出来ませんでした。申し訳ございません。
F1$、F2$はファイル名と思いますが、Byvalとは
どういった意味なのでしょうか?
またファイル設定はF1 = Dir("C:\vb\xx.dat")
という感じでよいのでしょうか?
調べれば調べるほど、迷宮に入っていって混乱しております。
どうか御教授御願い致します。
No.1
- 回答日時:
「ファイルを開いてデータを読み込み比較する」というのが本筋だと
思いますが、FCコマンドの実行結果をVB6でチェックする方が速いかな
とも思います。本筋は「バイナリファイルの比較」などで検索すると
ヒットすると思います。FCコマンドもググれば使い方が出てます。
FCの実行のさせ方は以下のURLを見てください。
http://msdn.microsoft.com/ja-jp/library/cc364356 …
nda23様
御回答頂きありがとうございます。
FCコマンドという方法勉強になりました。
ただVB初心者なもので貼っていただいたURLを見ても
FCコマンドの実行のさせ方が判りませんでした。
もう少しググってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 11:27
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- その他(パソコン・周辺機器) 同じファイル名 上書きしないフリーソフトなどあったら教えて下さい。 仕事で大量の写真などを扱っており 3 2023/05/18 06:43
- XML エクセルのマクロについて教えてください。 3 2023/02/06 09:06
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/06/04 09:39
- 統計学 お世話になっています. x軸は時間(期間)y軸はある値に対する2つのグラフ比較をしますが、私個人の考 2 2023/03/30 11:42
- Excel(エクセル) 配列操作について 5 2023/04/18 07:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel のページを Jpegファイル...
-
fortranのtxtファイル出力書式...
-
シェルコマンドの 2>&1 とはど...
-
VC++でUTF-8のファイルを出力し...
-
C言語でのppmファイル作成
-
VBA でメモ帳へ保存する際の保...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
BitBltについて。
-
COBOLのファイル出力
-
Base64でエンコードした後の文...
-
Visual Basic 6.0で 1行 読...
-
フォルダー、ファイル名を一括...
-
printfだと出力されるのにfprin...
-
Acccess レポートをグループ別...
-
PDFファイルを指定の名前でプロ...
-
MS-Word で作成した表をLatexに...
-
ファイル出力の場所を指定
-
Paiza Cloudです。学籍番号と氏...
-
CSV形式に変換
-
現状USB3.0が有用に使えるパー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
ファイル出力の場所を指定
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
Acccess レポートをグループ別...
-
Wordマクロで指定したフォルダ...
-
二次元配列をクリップボードに...
-
ファイル形式またはファイル拡...
-
CreateProcess関数と実行後の戻...
-
fortranのtxtファイル出力書式...
-
サウンド出力のデバイスを選択...
-
VBA でメモ帳へ保存する際の保...
-
1行ずつではなくまとめてファイ...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
C++ fprintf_sの使い方がわからん
-
ファイルの文字コードをUTF-8に...
-
pLaTeX の EPSファイル読み込み...
-
AccessVBA複数レポート条件毎に...
-
標準出力とファイルに効率的に...
おすすめ情報