• ベストアンサー

ディレクトリのファイル作成を監視する?

ディレクトリに、データファイルを保存するプログラムを作成しました(perl)そのディレクトリに出力されたファイルを直後にDB登録したいのですが、どのような方法があるのか?考え中です。イメージですが ディレクトリを監視して、ファイル作成されたらDB登録する。 というようなことが、出来るでしょうか? OSはRedhat DBはpostgresなのですが、いい方法ありましたら、よろしくお願い致します。 そのディレクトリは他のプログラムでも参照してるため、消したり移動出来ない事と、ファイル作成された直後に登録したのです。。

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

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

ずっと動かし続けることができるのであれば こんな感じではどうですか #!perl #監視するディレクトリ $kansidir = "c:/xxx"; guruguru: opendir(DIR, $kansidir); @dir = grep (-f "$kansidir/$_" && !exists $sumifile{$_}, readdir(DIR)); closedir(DIR); foreach (@dir) { $sumifile{$_} = ''; #DB登録... } goto guruguru;

kkuurroo
質問者

お礼

ご回答ありがとうございます。 早速試します。ずっと起動させるわけですね ありがとうございました。」

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

基本的には#2の方ような方法になると思いますが、以下の点を考慮すべきです。 1.ファイル名を取得した時、まだそのファイルが、書き込み中の可能性がある。従って、書き込みが完了したファイルのみを処理する必要がある。 2.DBに登録完了したファイル名を、2度と処理しないようにするにはどうするか。内部メモり(perlの変数)に処理済みのファイル名を格納する方法をとると、スクリプトを停止され、その後再起動すると、誤動作する。 3.処理を繰り返すときに一定時間スリープする。(sleepを使用する) 上記の問題に対する解決方法ですが、 1については、有効な決め手はありません。一定間隔で、ファイルの存在を確認したとき、そのファイルサイズも記憶し(stat関数で取得)、そのサイズが所定時間変化しなかった時、書き込み完了と見なす方法が考えられます。この所定時間は、書き込み処理と相談して、適切と思われる値にすべきです。(非常におおきければ、確実だがその分DBへの登録が送れる) 2については、処理済みとなったファイルを他のディレクトリに移動して良いならそれが、最も簡単な方法です。もし、移動が許されないなら、処理済みとなったファイル名を、その都度、別のファイルに書き込んでおき、スクリプトが立ち上がるとき、その別ファイル名を読み込み、記憶を取り戻すようにする必要があります。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Perlからデータファイル書き出す時に postgresにも出力すればいいのでは?

kkuurroo
質問者

お礼

ご回答ありがとうございます。 データファイルは、とあるアプリケーションで作成しておりました。こちらで作成してもではありませんでした。大変失礼いたしました。誤解をまねいてすいませんでした。