1

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

これは可能ですか?WindowsでもLinuxでも大丈夫です。

私がやろうとしている具体的なことは、FFMPEG でビデオをログに記録し、1 時間のビデオを作成することです。

4

2 に答える 2

2

Windows と Linux の両方で可能ですが、関連するアプリケーション間の連携が必要です。新しいデータをファイルに書き込んでいるアプリケーションが、他のアプリケーションが何をしているかを認識していない場合、おそらく動作しません (まあ...いくつかの可能性があります...すぐに戻ってください)。

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

ただし、ファイルを共有するだけでなく、アプリケーション間の操作を調整する必要もあります。ある種のロック メカニズムを使用する必要があります (ファイルの一部または共有ミューテックス/セマフォをロックすることによって)。ファイルのロックを使用する場合、ファイル内の既知のオフセットをロックして「セマフォ」として機能させることができることに注意してください (ファイルの物理的な末尾を超えるバイト値になることもあります)。1 つのアプリケーションが、別のアプリケーションがファイルを切り捨てているのとまったく同じ時刻にファイルに追加していた場合、予測できない結果が生じる可能性があります。

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

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

于 2012-05-12T13:48:51.793 に答える
0

logrotate は Linux の場合に適したオプションであり、ほぼすべてのディストリビューションに搭載されています。どこかに似たようなWindowsサービスがあると確信しています

于 2012-05-12T14:42:12.387 に答える