open()
ファイルを縮小する方法はありますか?もちろん、それらを追加モードで開くか、最後まで検索して書き込み、それらを拡張させることができます。ただし、私が知る限り、一般的なUNIXスタイルのシステムコールインターフェイスを介してファイルを圧縮する方法はありません。
これを行う唯一の方法は、私の知る限り、新しい短いファイルを作成しrename()
て古いファイルの代わりにそれを偽造することです。
新しいファイルを作成して名前を変更するプロセスを実行する代わりに、ファイルを直接操作するファイルエディターを作成することが可能であることを示唆する回答を見たので、私は確認だけを望みました。
私は、libcおよびunixスタイルのシステムコールインターフェイスのファイルapiでは、ファイルシステムの実装を容易にするためのファイルの縮小ができず、おそらく断片化に寄与する可能性のある使用パターンを回避できないと思っていました。
open()
、openat()
すでに切り捨てのフラグがあるO_TRUNC
ので、技術的にはiノードを変更せずにファイルを縮小します(つまり、完全に縮小します)。その最も有名な例はcommand > file.txt
で、ファイルが存在する場合は切り捨てられます。実行strace
するbash -c 'true > /dev/null'
とopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
、出力に表示されます。もちろん、可変サイズの切り捨ての場合は、truncate()
syscall が必要です。これをコメントではなく実際の回答としてご希望の場合はお知らせください。
fopen
モード "w"(または "w +")でファイルを開くだけで、自動的に長さがゼロに切り捨てられます。または、古いコンテンツの一部を保持するために、ゼロ以外のサイズに縮小することを意味しますか?