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

解決


難しいです  2008-05-30 22:54:33  No: 139812

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

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

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

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

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

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

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


  2008-05-30 23:17:16  No: 139813

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

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


魔界の仮面弁士  2008-05-30 23:30:08  No: 139814

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-31 00:04:49  No: 139815

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

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

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


難しいです  2008-05-31 01:28:15  No: 139816

上手くいきました!!!

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


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加