open()
ファイルを小さくする方法はありますか?もちろん、追加モードで開くことも、最後までナビゲートして成長させることもできます。しかし、私が知っている限り、一般的なUnixスタイルのシステムコールインターフェイスを介してファイルを縮小する方法はありません。
私が知っている限り、これを行う唯一の方法は、より短い新しいファイルを作成し、古いrename()
ファイルを置き換えて偽にすることです。
ちょうどその場で新しいファイルを作成し、名前を変更するプロセスを経ずに、ファイルから直接動作するファイルエディタを作成することが可能であるという答えを見て確認したかったです。
私はいつもlibcのファイルAPIとUnixスタイルのシステムコールインターフェイスがファイルシステムの実装を簡素化し、断片化につながる可能性がある使用パターンを避けるためにファイルを縮小することを許可していないと思いました。
答え1
DESCRIPTION
The truncate() and ftruncate() functions cause the regular file
named by path or referenced by fd to be truncated to a size of precisely
length bytes.
...
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).
引き続き ftruncate では書き込み用にファイルを開く必要があり、 truncate ではファイルを書き込むことができる必要があると言います。
答え2
これopen(2)
システムコールはO_TRUNC
ファイルサイズを減らすことができるフラグを許可します。
O_TRUNC
- ファイルが存在し、通常のファイルであり、ファイルが正常に開かれた場合、またはファイルが開かれると、ファイルのO_RDWR
長O_WRONLY
さがゼロに切り捨てられ、モードと所有者は変更されません。 FIFO特殊ファイルや端末デバイスファイルには影響しません。他のファイルタイプへの影響は実装によって定義されます。 orをO_TRUNC
使用しなかった結果は定義されていません。O_RDWR
O_WRONLY
プログラムがファイルの内容を完全に上書きすることを目的とする場合によく使用されます。に示すように、シェルのファイルリダイレクト演算子を例に挙げますcommand > file
。