2012-01-05 13 views
3

調査をしても、私の問題の解決策を見つけることができなかったのですが、ここでstackoverflowに投稿することにしました。別のプログラムが開いているファイルがあるかどうかを確認

まあ私の問題は、私は、私はすべての答えを見つけることができなかった理由だと思う一種の珍しいです:

私は、ファイルにコンテンツを記録しているプログラムを持っています。それから私はそのファイルを転送する責任がある別のものを持っています。最後に、ファイルを取得して処理する3番目のファイルがあります。

私の問題は: ファイル転送プログラムは、ファイルがまだ記録されている間に送信する必要があります。問題は、ファイル転送プログラムがファイルの末尾に到達しても、ファイルが実際にはまだ記録されているため、ファイルが実際に完全であるとは限りません。

レコーダーがそのファイルをまだ開いているかどうか、またはファイルの終わりが実際にファイルの終わりであるかどうかを判断できるように既にクローズしているかどうかを確認するのは良いことです。それ以上のデータはまだ読み取られません。

あなたはこの1つで私を助けてくれることを願っています。多分あなたはこの問題を解決する方法について別のアイデアを持っているかもしれません。

ありがとうございます。

GeKod

+0

おそらく 'inotify'ですか?ファイルが閉じられたときに通知されます。 – cha0site

+0

類似/重複 - http://stackoverflow.com/questions/1087204/how-can-i-tell-if-a-file-is-open-elsewhere-in-c-on-linux –

+0

作家のソース? – alk

答えて

1

簡単に言えば - あなたはすべてのファイルシステムの通知メカニズム、WindowsやLinuxを使用してOSXせずにこのの味を持つことはできません。私はWindowsが私の頭の上からそれをどうやって行うのか忘れるが、Linuxには 'inotify'があり、osxには 'knotify'がある。

これを簡単に処理するには、tmpファイルに記録します。録音が完了したらファイルを「ready-to-transfer-the-file」ディレクトリに移動します同じファイルシステム上にある場合は、転送ユーティリティが新しいファイルを見ているときはいつでも、完全に形成され、移動する準備ができていることを確実にします。

または、あなたのtmpファイルに拡張子がない場合は、ファイルの名前を転送エージェントがポーリングする拡張子に変更します。

+0

ご返信ありがとうございます。簡単な方法は私のために動作しません私は問題がファイルが記録されている間に転送する必要があると思う。ファイルを送信するためにファイルが完全に記録されるまで待つことはできません。 – gekod

+0

* notifyファミリーの何かが、おそらくあなたの最善の策でしょう。そうでなければ、変更をポーリングして、ファイルが「完了」したときに想定するタイムアウトがなければなりません。 – synthesizerpatel

+0

はい私は実際にファイルサイズの変更についてポーリングを検討していましたが、それは私にはきれいな解決策ではないようです。再度ありがとう:) – gekod

0

レコーダープログラムと記録されたデータ/ファイルを取得するプログラムの間にストリームインターフェイスを使用することを検討しましたか?ストリーム信号/プリミティブの信頼できるエンドを提供するストリームインターフェイス(OS /スタックサービスなど)にアクセスできる場合は、ファイルインターフェイスを置き換えることもできます。

0

これにはCで使用できる関数/ライブラリはありません。しかし、単純な代替案は、アクティビティが終了したらファイルの名前を変更することです。たとえば、レコーダーはファイル名をfile.recordで開き、録音を完了するとfile.recordの名前をfile.transferに変更することができ、転送プログラムではfile.transferが転送され、転送が完了するとファイル名はfile.readに変更されます。読者はそれを読んで、最後にそれをfile.doneに改名することができます!ファイルが

FILE_NAME="filename" 
FILE_OPEN=`lsof | grep $FILE_NAME` 

// if [ -z $FILE_NAME ] ;then 
    // "File NOT open" 
// else 
    // "File Open" 

を次のように開いているかどうかをチェックすることができます

+0

答えをありがとう。すでに述べたように、ファイルが完全に記録されるまで待つことはできません。録音と転送は同時に発生する必要があります。 – gekod

0

を参照してください。あるプログラムが別のプログラムで作業しているファイルを使用している場合、そのプログラムはブロックされるか、エラーが発生します。あなたがそれにアクセスすると、そのアクションはOkeyですが、結果は予測できません。一貫性を維持するために、ファイルにアクセスしたいすべてのプロセスは、アドバイザリロックルールに従ってください。それがうまくいくと思います。

ファイルが閉じられると、ロックも解放されます。他のプロセスがファイルを保持しようとする可能性があります。

関連する問題