3

たくさんの調査を行った後、私の問題の解決策を見つけることができなかった後、私はここにstackoverflowに投稿することにしました。

さて、私の問題はちょっと変わっているので、それが私が答えを見つけることができなかった理由だと思います:

私はファイルにものを記録しているプログラムを持っています。次に、そのファイルの転送を担当する別のファイルがあります。最後に、ファイルを取得して処理する3番目のファイルがあります。

私の問題は次のとおりです。ファイル転送プログラムは、ファイルがまだ記録されている間にファイルを送信する必要があります。問題は、ファイル転送プログラムがファイルのファイルの終わりに達したときに、ファイルがまだ記録されているため、ファイルが実際に完了したことを意味しないことです。

レコーダがそのファイルをまだ開いているかどうか、またはすでに閉じているかどうかをチェックして、ファイルの終わりが実際にファイルの終わりであるかどうか、または単にそれ以上のデータがないかどうかを判断できるようにすると便利です。まだ読んでください。

これで私を助けてくれることを願っています。たぶん、あなたはこの問題を解決する方法について別の考えを持っています。

前もって感謝します。

GeKod

4

5 に答える 5

1

簡単に言えば、ファイルシステム通知メカニズムを使用せずに使用することはできません。Windows、Linux、OSXにはすべてこのフレーバーがあります。Windowsが頭から離れてそれを行う方法を忘れていますが、Linuxには「inotify」があり、osxには「knotify」があります。

これを処理する簡単な方法は、tmpファイルに記録することです。記録が完了したら、ファイルを「ファイルを転送する準備ができました」ディレクトリに移動します。これを行うと、ファイルが同じになります。ファイルシステムを移動すると、それはアトミックで瞬時になり、転送ユーティリティが新しいファイルを「検出」したときに、完全に形成されてすぐに使用できるようになります。

または、tmpファイルに拡張子を付けないようにし、それが完了したら、転送エージェントがポーリングしている拡張子にファイルの名前を変更します。

于 2012-01-05T09:52:27.390 に答える
0

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

于 2012-01-05T09:54:17.233 に答える
0

これを行うためにCで使用できる関数/ライブラリはありません。ただし、簡単な方法は、アクティビティが終了したらファイルの名前を変更することです。たとえば、レコーダーは名前でファイルを開くことができます-file.record録音が完了すると、名前をに変更できfile.recordfile.transfer転送プログラムは転送を探す必要がありますfile.transfer。転送が完了するfile.readと、ファイルの名前をに変更でき、リーダーはそれを読み取ることができます最後に名前をfile.done!に変更します。

于 2012-01-05T09:55:41.827 に答える
0

次のようにファイルが開いているかどうかを確認できます

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

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

http://linux.about.com/library/cmd/blcmdl8_lsof.htmを参照してください

于 2012-01-05T09:56:38.413 に答える
0

アドバイザリーロックが役立つと思います。他のプログラムが処理しているファイルを使用していると、ブロックされたりエラーが発生したりします。ただし、有効にアクセスした場合、アクションはOKですが、結果は予測できません。一貫性を維持するために、ファイルにアクセスするすべてのプロセスは、アドバイザリロックルールに従う必要があります。私はそれがうまくいくと思います。

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

于 2012-01-05T10:08:58.443 に答える