別のファイルを使用せずに、ファイルの一部 (最初から半分まで) を削除することはできますか?
ありがとう!
はい、可能ですが、ファイルの大部分を書き直す必要があります。
大まかなアイデアは次のとおりです。
open the file
beg = find the start of the fragment to be removed
len = length of the fragment to be removed
blocksize = 4096 -- example block size, may be any
datamoved = 0
do {
fseek(pos +len +datamoved);
if( endoffile ) return; -- finished!
actualread = fread(buffer, blocksize)
fseek(pos + datamoved)
fwrite(buffer, actualread)
datamoved += actualread
}
ループ後の最後のステップは、ファイルを pos+datamoved サイズに「切り捨てる」ことです。基礎となるファイルシステムが「truncatefile」操作を処理しない場合は、書き直す必要があります..しかし、ほとんどのファイルシステムとライブラリはそれをサポートしています。
簡単に言えば、いいえ、ほとんどのファイル システムはそのような操作をサポートしようとはしていません。
これにより、2 つの選択肢が残ります。明らかな方法は、データのコピーを作成して、不要な部分を除外することです。これは、インプレース (つまり、同じファイル内でデータを移動する) または補助ファイルを使用して行うことができます。通常、データを新しいファイルにコピーしてから、新しいファイルの名前を古い名前に変更するなどの操作を行います。
もう 1 つの主要な選択肢は、古いデータをまったく削除する必要がないように、ファイルとデータを単純に再構築することです。たとえば、プロセスからの最新の N 個のデータを保持したい場合は、(ほとんどの) ファイルを循環バッファーとして構造化し、最初にいくつかの「ポインター」を使用して、先頭と末尾のポイントを示します。 、データの読み取り元/書き込み先がわかります。このような構造では、古いデータを消去または削除するのではなく、必要に応じて上書きするだけです。
十分なメモリーがある場合は、その内容をメモリーに完全に読み取り、それをファイルの先頭にコピーして戻し、ファイルを切り捨てます。
十分なメモリがない場合は、ブロック単位でコピーし、完了してからファイルを切り詰めてください。