• ベストアンサー

ファイル比較について

VB6でHD内にあるデータとFD内にあるデータを 順番に比較したいと思っております。ファイル数は26個程で 形式はバイナリ形式のファイルです。 変換して出来たファイルをHDとFDにコピーしているのですが FDにコピーしたファイルが書き込み不良等でたまにHD内のファイルと 違っています。 今はテキストエディターのファイル比較を手動で行なっておりますが 変換時に自動で比較できればと考えております。 どなたか御教授御願い致します。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答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を使う高等技もあるが、とりあえずは これを使ってみてください。

tsu0_001
質問者

お礼

nda23様 度々のアドバイスありがとうございます。 記入頂いたソースを見ても何がどうなっているかピンとこない為 1から調べて理解したいと思います。

その他の回答 (4)

  • nda23
  • ベストアンサー率54% (777/1415)
回答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への代入はやめましょう。パラメータに した意味がありませんから。

tsu0_001
質問者

お礼

nda23様 度々の回答ありがとうございます。 お礼が遅くなった事お詫び申し上げます。 F1,F2への代入はやめた方が良いとありますが どういった意味か考えたのですが理解出来ませんでした。 すいません。 基本的な事から勉強する必要を痛感しております。 ネット等でどなたか良いページを知っている方はおりませんでしょうか? 宜しくお願い致します。

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

>F1$、F2$はファイル名と思いますが そうです。正しくは「F1 As String」と記述します。"$"は文字型を 示す型記号です。(VB.NET以降は使えない) >F1 = Dir("C:\vb\xx.dat") こうすると、F1には"xx.dat"が代入されます。Dirは不要です。 >Byvalとは 「値渡し」という指定です。呼び出し元はパラメータのコピーを関数に 渡します。関数側でパラメータの内容を変更しても、呼び出し元の 変数が書き換わることはありません。これに対し、「参照渡し」という 方法があります。キーワードは"ByRef"です。省略時はこれです。 この場合、関数側で変数を変更すると、呼び出し元のデータも変更 されます。 今回は「パラメータは受け取るだけで、内容は変更しない」という ことを明示的に表す目的で記述しました。

tsu0_001
質問者

お礼

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

  • nda23
  • ベストアンサー率54% (777/1415)
回答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.aspx

tsu0_001
質問者

お礼

nda23様 解説までして頂きありがとうございます。 何を実施しているかある程度理解出来ました。 ただ上の解説で理解出来たのでですが下記の Function Comp(ByVal F1$, ByVal F2$) As Long が理解出来ませんでした。申し訳ございません。 F1$、F2$はファイル名と思いますが、Byvalとは どういった意味なのでしょうか? またファイル設定はF1 = Dir("C:\vb\xx.dat") という感じでよいのでしょうか? 調べれば調べるほど、迷宮に入っていって混乱しております。 どうか御教授御願い致します。

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

「ファイルを開いてデータを読み込み比較する」というのが本筋だと 思いますが、FCコマンドの実行結果をVB6でチェックする方が速いかな とも思います。本筋は「バイナリファイルの比較」などで検索すると ヒットすると思います。FCコマンドもググれば使い方が出てます。 FCの実行のさせ方は以下のURLを見てください。 http://msdn.microsoft.com/ja-jp/library/cc364356.aspx

tsu0_001
質問者

お礼

nda23様 御回答頂きありがとうございます。 FCコマンドという方法勉強になりました。 ただVB初心者なもので貼っていただいたURLを見ても FCコマンドの実行のさせ方が判りませんでした。 もう少しググってみます。

関連するQ&A

  • バイナリファイルの比較について困っております

    FDにあるファイルとHDにあるファイルをバイナリで開き 1バイトずつ比較を実施したいと考えております。 バイナリでファイルオープンまでは何とか出来たのですが、 ファイルを読み込み、1バイトずつ比較する方法が判りません。 どなたか御教授御願い致します。

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

    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

  • バイナリファイルの編集

    stirling,bzなどのエディタを用いて、バイナリファイルを編集しようとしています。 テキスト(a.txt)のデータをバイナリファイルにコピペしようとしたのですが・・・ テキストで「ff ff ff ff」と書いてあったデータが、バイナリファイルにコピペすると「4646~」というように変換されてしまいました。 バイナリファイルでも「ff ff ff ff」とコピーしたい場合はどのようにすれば良いのでしょうか?

  • 入力ファイルをバイナリにする利点

    CSV形式の入力ファイルをテキストではなく、バイナリのCSVに変換して利用する利点てなんでしょうか? つまり、とあるプログラムで「.csvファイル」を、エディタで開くと文字化けする「拡張子なし(または.dat)ファイル」に変換してからそれを入力ファイルとしているのですが、素人の自分から考えると、テキスト形式で作ったCSVファイルをそのまま入力ファイルにすればいいんじゃないかと思ってしまいます。 バイナリの方が読み込み、書き込みが速くなるのでしょうか? またはバイナリでないとできないことがあるのでしょうか? ポインタなどが関係しているのでしょか? ちなみにその開発環境はVC++です。

  • バイナリファイルの書き出し

    バイナリファイルにデータを書き込むプログラムを作りたいと思っています。実は、Standard MIDI Fileのバイナリファイルを作りたいんです。 SMFについては、今まで、直接バイナリエディタで開き、16進数の数字をいじくって、データ書き換えたりしてたので直接バイナリファイルに16進数での数字を書きたいんです。 たとえば、テキストファイルに903C408360803C0000みたいに吐き出すプログラムでは、バイナリファイルに書き出してからバイナリエディタで開くと こいつがさらに16進数に変換されてしまいますよね? そうならないようにするにはどうやればいいんですか?

  • iso形式のファイルがフォルダになってしまいました

    娘の成長記録のDVDをiso形式に変換して保存しておいたものを一時的に外付けHDDに退避させておいたところ、そのisoデータがフォルダになってしまっていました。 しかも、もとのデータはそのことに気付かずに消して(フォーマット)しまいましたので、そのフォルダになってしまったデータをiso形式のファイルに戻すしか復旧させる方法が残っていません。 バイナリエディタ(Stirling)で開いてみようとしましたが、アクセスを拒否されてしまい、バイナリレベルでの変更もできませんでした。 ちなみにそのフォルダになってしまったデータの中には1とか2とかっていうファイルが入っていて4GBとかのデータがありました。 元々はiso形式のファイルがフォルダになってしまった場合のデータの戻し方を教えてください。 PCはXP Homeです。 宜しくお願い致します。

  • ファイル比較を出力したい

    エディターなどで2つのファイルを比較し「見る」ことはできるのですが、そのファイルの比較結果を「差分」がわかる形でファイル出力またはプリントする方法のアドバイスをいただけないでしょうか。 #ファイルはテキスト形式のものを比較 #質問の場所はここでよいか不安ですが、きっといろいろ実務で使っていることではと想像してこちらでお聞きします。

  • バイナリファイル

    VBでバイナリファイルを読み込み、処理しようとしているのですが、VBではバイナリファイルを扱えないのでしょうか? APIしかないのでしょうか? 例) バイナリデータ:10(16進) 取扱データ:16(10進) 上記のことをしたいのですが、うまく扱えません。 CDecも"&H10"なら16として扱えるのですが、バイナリデータをそのまま数値化することができません。 何か良い方法があれば教えて下さい。

  • バイナリ形式など、ファイルサイズを小さく保存したい

    あるファイルへデータを書き込み保存したいのですが、テキスト形式ではなく、バイナリ形式など、ファイルサイズが小さくて済む書き込み方法はないでしょうか?

  • バイナリエディタで同じファイルでも

    バイナリエディタで開いて比較するとまったく同じだと言われる2つのファイルがあります。 しかし、この2つのファイルの、片方は対応のソフトで開けるのですが、もう片方はエラーとなってしまいます。 この違いはどんなところにあるのでしょうか?? バイナリエディタで同じと言われたら、それはまったく同じファイルではないかと思っていたのですが、違うのでしょうか。 あまり詳しくはわからないのですが、思い当たる節があればご教授頂きたいと思います。 よろしくお願いします。

専門家に質問してみよう