典型的なシステムコールインターフェイスでは、ファイルのサイズを(別のiノードに置き換えることなく)削減できますか?


9

open()ファイルを縮小する方法はありますか?もちろん、それらを追加モードで開くか、最後まで検索して書き込み、それらを拡張させることができます。ただし、私が知る限り、一般的なUNIXスタイルのシステムコールインターフェイスを介してファイルを圧縮する方法はありません。

これを行う唯一の方法は、私の知る限り、新しい短いファイルを作成しrename()て古いファイルの代わりにそれを偽造することです。

新しいファイルを作成して名前を変更するプロセスを実行する代わりに、ファイルを直接操作するファイルエディターを作成することが可能であることを示唆する回答を見たので、私は確認だけを望みました。

私は、libcおよびunixスタイルのシステムコールインターフェイスのファイルapiでは、ファイルシステムの実装を容易にするためのファイルの縮小ができず、おそらく断片化に寄与する可能性のある使用パターンを回避できないと思っていました。


2
fopenモード "w"(または "w +")でファイルを開くだけで、自動的に長さがゼロに切り捨てられます。または、古いコンテンツの一部を保持するために、ゼロ以外のサイズに縮小することを意味しますか?
ウィザード

4
参考までに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 が必要です。これをコメントではなく実際の回答としてご希望の場合はお知らせください。
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy任意のサイズに縮小することを考えていました。David Foersterの質問のサブセットに答えるため、私はそれを支持しましたが、イカルスの質問に照らしてそれを受け入れません。イカロスの答えは、本当の答えが「イエス」であることをすでに示していたのに対して、私はそれを「はい」と「いいえ」のタイプの答えとみなしたでしょう。
JoL

回答:


22

man -s 2 ftruncate 言う

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を使用する場合は、ファイルを書き込み可能にする必要があります。


ファイルへの追加は最初にOSを起こしtruncate、新しいファイルサイズに対応するために、それ、およびそれから writeそれ。だから、truncateあなたが探しているシステムコールがあります。
mgarciaisaia

1
Linuxでは、また見るfallocate(FALLOC_FL_COLLAPSE_RANGE)
ステファンChazelas

2

open(2)システムコールは受け付けてO_TRUNCファイルサイズを小さくすることができフラグ:

O_TRUNC–ファイルが存在し、それが通常のファイルであり、ファイルが正常に開かれたO_RDWR場合O_WRONLY、またはである場合、その長さは0に切り捨てられ、モードと所有者は変更されません。FIFO特殊ファイルまたは端末デバイスファイルには影響しません。他のファイルタイプへの影響は実装定義です。使用した結果O_TRUNCのいずれかなしO_RDWRO_WRONLY定義されていません。

これは、プログラムがファイルの内容全体を上書きすることを目的とする場合に頻繁に使用されます。例として、シェルのファイルリダイレクト演算子がありcommand > fileます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.