6

一時ファイルを作成せずにファイルに行を追加またはファイルから削除する方法について、unix.stackexchange でさまざまな質問/回答を読みました。

https://unix.stackexchange.com/questions/11067/is-there-a-way-to-modify-a-file-in-place?lq=1

これらの回答はすべて、少なくともファイルの最後まで読み取る必要があるようです。入力が大きなファイルの場合、これには時間がかかる可能性があります。これを回避する方法はありますか?ファイルシステムはリンクリストのように実装されることを期待しています...したがって、必要な「行」に到達してから、もの(リンクリストのノード)を追加する方法が必要です。どうすればこれを行うことができますか?

そう考えるのは正しいですか?または、何か不足していますか?

Ps: これは 'C' で行う必要があり、シェル コマンドは使用できません。

4

4 に答える 4

9

Linux 4.1 の時点で、fallocate(2)はフラグをサポートしてFALLOC_FL_INSERT_RANGEいます。これにより、後続のデータを書き換えることなく、ファイルの途中に指定された長さの穴を挿入できます。ただし、かなり制限されています。ホールはファイルシステムのブロック境界に挿入する必要があり、挿入されるホールのサイズはファイルシステムのブロックサイズの倍数でなければなりません。さらに、4.1 では、この機能は XFS ファイルシステムでのみサポートされ、Ext4 のサポートは 4.2 で追加されました。

他のすべてのケースでは、他の回答で示されているように、ファイルの残りの部分を書き直す必要があります。

于 2015-10-26T05:31:04.263 に答える
9

簡単に言えば、はい、ファイルの内容をその場で変更することは可能ですが、いいえ、ファイルの途中で内容を削除または追加することはできません。

UNIX ファイルシステムは、データのブロック全体を指すinode ポインター構造を使用して実装されます。テキスト ファイルの各行は、前または次の行との関係を「認識」しておらず、ブロック内で互いに隣接しているだけです。これらの 2 行の間にコンテンツを追加するには、後続のすべてのコンテンツをブロック内でさらに「下に」シフトする必要があり、一部のデータを次のブロックにプッシュし、次のブロックにシフトする必要があります。

Cでは、更新のためにファイルを開き、その内容を読み取り、内容の一部を上書きすることができますが、途中で新しいデータを挿入したり、データを削除したりする方法は(理論的にさえ)ないと思います(上書きすることを除く)ヌル付き。

于 2013-06-19T18:15:38.963 に答える
4

を使用して、その場でファイルを変更できますdd

$ echo Hello world, how are you today? > helloworld.txt
$ cat helloworld.txt
Hello world, how are you today?
$ echo -n Earth | dd of=helloworld.txt conv=notrunc bs=1 seek=6
$ cat helloworld.txt
Hello Earth, how are you today?

問題は、変更によって長さも変更されると、正しく機能しないことです。

$ echo -n Joe | dd of=helloworld.txt conv=notrunc bs=1 seek=6
Hello Joeth, how are you today?
$ echo -n Santa Claus | dd of=helloworld.txt conv=notrunc bs=1 seek=6
Hello Santa Clausare you today?

長さを変更するときは、ファイルを書き直す必要があります。完全でない場合は、変更した時点から開始します。

C では、これは と同じddです。ファイルを開き、シークし、書き込みます。

于 2013-06-19T18:33:21.977 に答える
0

ファイルを読み取り/書き込みモードで開くことができます。ファイルを読み取り(または、「シーク」を使用して目的の位置にジャンプします)、ファイルに書き込みますが、ここにあるデータを上書きします(これは挿入ではありません)。次に、最後に書き込んだ時点からファイルを切り捨てるか、書き込んだ時点以降の残りのデータをすべて読み取らずに保持するかを選択できます。

于 2014-08-18T16:24:28.253 に答える