ファイルオープン時に、現在開こうとしているファイルの状態取得

解決


難しいです  2008-05-30 13:54:33  No: 139812  IP: 192.*.*.*

VB6を使用しております。
プログラムが2つあります。
①ファイルを作成し、ファイルがあればデータを書き込むプログラム
②ファイルを読込、また表示するプログラム

シーケンシャルファイルアクセスで、①でファイルを作成して、②で表示させるところまではうまくいきました。

ですが、①でファイルを作成または書き込み中に、②でデータを読もうとしてもうまくいきません。

そこで「対象のファイルが開かれているかどうか」を②のプログラムで取得できないのでしょうか?

思いついたのが・・・
①でファイルを開けるときに、「ファイル作成中.txt」みたいなファイルを作っておいて、作成終了したら①が削除する。
②は「ファイル作成中.txt」ファイルがない場合にデータ読み込みする。

といった方法ぐらいしか思いつきませんでした。

何か良い方法を知っている方がいらっしゃいましたら、ご教授下さい。
宜しくお願い致します。

編集 削除
 2008-05-30 14:17:16  No: 139813  IP: 192.*.*.*

①でOpenするときに、lock引数にLock Read、またはLock Read Writeを
指定すると、他のプロセスでは読めなくなる(後者は書き込みも不可)
…らしい
(VBのヘルプでは細かく書かれていないが、ググれば書かれてるサイトもある)

で、②の方では、①でOpen中の場合は開けなくなるので、エラートラップして
しまえばいい(特定のエラーになったら他でOpen中…と)
エラーコードは実際に調べてみてね

編集 削除
魔界の仮面弁士  2008-05-30 14:30:08  No: 139814  IP: 192.*.*.*

Open ステートメントを使うのか、FileSystemObject を使うのか、
その他の方法を使うのかによって、それぞれコードは異なります。


> ですが、(1)でファイルを作成または書き込み中に、(2)でデータを読もうとしてもうまくいきません。
書き込み側は、出力専用モードで開いてください。
(たとえば、Open 時に For Append Access Write Lock Write を指定するなど)

なお、書き込み側が Close するまでは、出力結果がファイルに反映されない事がありますので、
Open / Close をこまめに行うか、意図的に Seek ステーメントを呼び出すようにしてください。


また読み込み側は、EOF到達後にファイルの内容が更新されても、EOF 関数の結果が
変化しない事がありますので、再 Open または Seek による再読み込みが必要かも知れません。


> そこで「対象のファイルが開かれているかどうか」を(2)のプログラムで取得できないのでしょうか?
同時 Open が必要な場合は、基本は On Error ステートメントを使って、
「ファイルを読み込んでみて、エラーになるかどうか」で処理する事になるでしょう。

事前判定を行ったとて、判定してから開くまでの僅かな時間の間に、
別プログラムによってロックされてしまえば、同じ問題を引き起こすからです。


また、Open できた後も、Lock / Unlock ステートメントによってロックされる可能性が
ある場合、ファイルの読みこみ時にも、エラーチェックは必要となるでしょう。


> 「ファイル作成中.txt」ファイルがない場合にデータ読み込みする。
同時Open が必要では無い場合、書き込み側は別名ファイルとして出力する事を
検討してみてください。出力完了後、そのファイルを正しい名前にリネームすえれば、
読み込み側は、正規ファイルの存在チェックのみを行えば済む事になります。

編集 削除
難しいです  2008-05-30 15:04:49  No: 139815  IP: 192.*.*.*

あさん、魔界の仮面弁士さん

レスありがとうございます。

「Lock Read Write」でちょっとやってみたいと思います。

編集 削除
難しいです  2008-05-30 16:28:15  No: 139816  IP: 192.*.*.*

上手くいきました!!!

感謝!です。
ありがとうございました。

編集 削除