2012-05-12 6 views
1

常に使用中で書き込まれているファイルを(プログラムで)移動(またはコピーおよび切り詰め)できるようにします。これにより、書き込まれるファイルが決して大きくなりすぎることはありません。使用中のファイルを移動またはコピーして切り捨てます。

これは可能ですか? WindowsでもLinuxでも問題ありません。

具体的には、FFMPEGで動画をログに記録し、1時間の動画を作成することです。

答えて

2

WindowsとLinuxの両方で可能ですが、関連するアプリケーション間で協力が必要です。新しいデータをファイルに書き込んでいるアプリケーションが他のアプリケーションが何をしているのか分からない場合は、おそらくうまくいかないかもしれません(まあ、ある可能性があります。

一般に、これを機能させるには、共有ファイルを開く必要があります。たとえば、Windows APIのCreateFileを使用する場合は、両方のアプリケーションでFILE_SHARE_READFILE_SHARE_WRITEを指定する必要があります。これにより、両方の(複数の)アプリケーションがファイルを「並行して」読み書きできるようになります。

ファイルを共有する以外にも、アプリケーション間の操作を調整する必要があります。何らかの種類のロック機構を使用する必要があります(ファイルの一部または共有mutex/semaphoreをロックする)。ファイルロックを使用すると、ファイル内の既知のオフセットを "セマフォ"(ファイルの物理的な終端を越えるバイト値でも可能)としてロックすることができることに注意してください。 1つのアプリケーションが、他のアプリケーションがそれを切り捨てていたのと同じ時刻にファイルに追加していた場合、予測できない結果につながります。

お互いを認識する必要のある両方のアプリケーションについてのコメントに戻る...両方のアプリケーションがファイルを排他的に開いて、成功するまで操作を再試行した場合は、操作を実行してからファイルを閉じます本質的に、彼らはお互いの「知識」なしで働くことができます。しかし、それはおそらくうまくいかず、あまり効率的ではありません。

これまで述べてきたように、効率の理由から代替案を検討することをお勧めします。例えば、書き込みアプリケーションが新しいファイルに定期的に書き込むことが可能な場合、データをあるファイルから別のファイルに常に「移動」させるよりも効率的かもしれません。また、ファイルの一部を維持する必要がある場合(たとえば、最初の100 MBを別のファイルに移動してから2番目の100 MBを先頭に移動する必要がある場合)、それはかなり高価な操作になる可能性もあります。

0

logrotateはLinuxの良い選択肢になるでしょう。私はどこかに同様のWindowsサービスがあると確信しています

関連する問題