ファイル操作について

解決


ようこ  2004-08-10 15:06:51  No: 85075  IP: [192.*.*.*]

いつもお世話になってます。
VB6.0でFormの起動時にiniファイルからデータを読み込み、
終了時にiniファイルにデータを書き込む操作をやろうと思ってます。
ファイル操作のコードを3箇所で書いているのですが
実行していると、うまくいく時もあるのですが、毎回ではないのですが、
終了時に”すでにファイルは開かれています。”というエラーが出ます。
きちんと3つ全てのコードでClose  #FileNum
とコードを書いてるのですが原因がわかりません・・・
ご指導いただけると幸いです。
また、コードを見たら分かるかもという方がいらっしゃったら
載せさせて頂きます。

編集 削除
nanashi  2004-08-10 15:15:00  No: 85076  IP: [192.*.*.*]

もちろんコードを見ないと何も分かりませんが、
iniファイルを扱うならAPIを使った方が便利ですよ。

GetPrivateProfileStringとWritePrivateProfileStringで出来ます。

編集 削除
ようこ  2004-08-10 15:33:22  No: 85077  IP: [192.*.*.*]

nanashiさんありがとうございます。
初心者なので無駄な部分が多いかと思いますが
コードを載せさせて頂きます。

メイン画面起動時
Private Sub Form_Load()
Dim FileNum As Integer    'ファイル番号を変数に格納
FileNum = FreeFile
Dim MyDir As String       '実行ファイル名を宣言
MyDir = App.Path          '実行ファイルを変数に格納
Dim temp As String        '読み込んだデータを変数に格納
Dim ReadData(99) As String  '配列の変数を指定
Dim i As Integer            '繰り返し命令の変数を指定

'iniファイルを開いて1行ずつ読み込み配列に格納
i = 0
Open MyDir & "\SvAliveCK.ini" For Input As #FileNum
Do Until EOF(FileNum)
    Line Input #FileNum, temp
    ReadData(i) = temp
    i = i + 1
Loop

   Close #FileNum

終了時(メイン画面)
Open MyDir & "\SvAliveCk.ini" For Output As #FileNum
   Print #FileNum, "[" & "Setting" & "]" & vbCrLf & "hostname = " & _
   svalu & vbCrLf & "ip=" & _
   Mid(lblHost.Caption, 11, 12) & vbCrLf & "MODE=" & K & vbCrLf & _
    "IntTimer=" & frmSettei.txtInterval.Text
    For i = 1 To l Step 1
    Print #FileNum, "[" & lstv.ListItems.Item(i).Text & "]"
    Print #FileNum, "IP_ADR=" & lstv.ListItems.Item(i).SubItems(1)
    Next i
Close #FileNum
End

サブ画面起動時(iniファイルから表示したいデータがあるため)

終了時に”すでにファイルが開かれています”とエラーが出た時に
デバッグすると
この画面のOpen MyDir & "\SvAliveCk.ini" For Input As #FileNumが
黄色く表示されます。

Private Sub Form_Load()

Dim FileNum As Integer    'ファイル番号を変数に格納
FileNum = FreeFile
Dim MyDir As String
MyDir = App.Path
Dim temp As String        '読み込んだデータを変数に格納
Dim ReadData(99) As String  '配列の変数を指定
Dim i As Integer            '繰り返し命令の変数を指定

'iniファイルを開いて1行ずつ読み込み配列に格納
i = 0
Open MyDir & "\SvAliveCk.ini" For Input As #FileNum
Do Until EOF(FileNum)
    Line Input #FileNum, temp
    ReadData(i) = temp
    i = i + 1
Loop
   Close #FileNum

長くてもうしわけありません。
きちんとCloseでファイルを閉じているつもりなのですが・・・

編集 削除
Max  2004-08-10 16:05:11  No: 85078  IP: [192.*.*.*]

FileNumは何処で初期化しているのですか?
ファイルを開くときは決めうちでファイル番号を指定するのではなく、直前で
FileNum = FreeFile
としてファイル番号を取得したほうがいいですよ。

編集 削除
nanashi  2004-08-10 16:23:28  No: 85079  IP: [192.*.*.*]

ん〜、これを見る限り特に問題は無さそうなんですが……。

ファイルの操作はこのiniファイルに対して以外は行っていないのでしょうか?
もしそうならFileNumは常に1のハズです。
エラー時にFileNumの値を見てください。
2以上の値であるなら、どこかでCloseし忘れてるのでしょう。

※それと、やはりiniファイルの操作はAPIを使った方がイイですよ。
  結構簡単ですしf^_^;

編集 削除
nanashi  2004-08-10 16:26:21  No: 85080  IP: [192.*.*.*]

”すでにファイルが開かれています”というエラーはファイル番号が同じ時にも出ますね。
Maxさんの仰るとおり、FreeFileの取得位置を確認した方がイイです。

編集 削除
ようこ  2004-08-10 16:56:27  No: 85081  IP: [192.*.*.*]

みなさんレスありがとうございます。
誠に勝手ですが、とりあえずAPIを使わずにやってみたいと
思ってます。本当にごめんなさい。

MaxさんのおっしゃるとおりOpenの前の行に
  FileNum = FreeFile  と書いて実行してみましたが
やはりたまにエラーが出ます。色々テストしてみたのですが、
エラーが出る時の共通点が見つからなくて困っています。
エラーが出た時のデバッグで、サブ画面のFileNumを見てみると
nanashiさんのおっしゃるとおり  FileNum = 2 となっていました。
なにか改善策はあるでしょうか?

編集 削除
Max  2004-08-10 17:17:17  No: 85082  IP: [192.*.*.*]

改善策はバグをつぶすことしかありません。
自分の作った処理の流れを良く追ってみてください。
エラーがでるには原因があるはずですから。

まずはFileNum = 2とならないようクローズし忘れているところを
探してみると良いでしょう。

編集 削除
ようこ  2004-08-11 10:54:03  No: 85083  IP: [192.*.*.*]

返信おくれてすいません。
昨日と今日で、ファイルを開いたり閉じたりする時に
FileNumを出すMsgBoxを表示させて、バグを探してみたところ、
エラーが起きる時は、メイン画面終了時のiniファイルを更新する時に
サブ画面のデータも持ってくるため、

メイン画面終了時iniファイルオープン      FileNum = 1
iniファイルを閉じる前にサブ画面でiniファイルオープン  FileNum = 2

となっていたのが原因でした。
みなさん本当に多数のレスありがとうございました。助かりました。

これからはAPIも使っていけるよう勉強していきたいと思ってますので
またわからないことがあったらよろしくお願いいたします。

編集 削除