%3F.png)
ファイルを縮小する方法はありますか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
、その長さは 0 に切り捨てられ、モードと所有者は変更されません。 FIFO 特殊ファイルまたは端末デバイス ファイルには影響しません。他のファイル タイプへの影響は実装定義です。 または のいずれO_TRUNC
も使用せずにを使用した場合の結果は未定義です。O_RDWR
O_WRONLY
これは、プログラムがファイルの内容全体を上書きしようとする場合によく使用されます。例としては、 のようなシェルのファイル リダイレクト演算子がありますcommand > file
。