2013-06-19 1 views
5

一時ファイルを作成せずにファイルを追加または削除する方法について、ここでさまざまな質問/回答をunix.stackexchangeで読んだ。ファイルの途中にコンテンツを追加する。終わりまで読むことなし

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

は、すべてのこれらの答えは、少なくとも1つの入力が大きいファイルの場合は時間がかかることがファイルの最後まで読んで必要な表示されます。これを回避する方法はありますか?私はファイルシステムがリンクされたリストのように実装されると期待しています。そのため、必要な "行"に到達し、次に物事を追加する方法(リンクされたリストのノード)が必要です。これをどうやって行うのですか?

私は考えて正しいですか?または私は何かが欠けている?

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

+0

ファイルはリンクリストとして実装されていないため、ファイルの途中にデータを挿入する簡単な方法はありません。ファイルの途中にデータを挿入する処理のコードについては、[SO 10467711](http://stackoverflow.com/questions/10467711)を参照してください。ただし、挿入ポイントに続くすべてのデータを新しい位置を修正する。 –

答えて

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と同じです。あなたはファイルを開いてシークし、あなたが書く。

6

短い答えは、はい、場所にファイルの内容を変更することが可能であるということですが、なし、削除するか、ファイルの途中でコンテンツを追加することはできません。

UNIXファイルシステムは、データブロック全体を指すinode pointer structureを使用して実装されています。テキストファイルの各行は、前の行または次の行との関係について「認識」していないため、ブロック内で単に隣接しています。これらの2つの行の間にコンテンツを追加するには、次のコンテンツのすべてをブロック内でさらに「下に」移動し、次のブロックに移動する必要があるデータを次のブロックに押し込む必要があります。

fopen a file for updateで内容を読んで内容の一部を上書きすることはできますが、理論的にも中間に新しいデータを挿入する方法やデータを削除する方法はありません(ヌルで上書きすることを除いて)。

+0

ありがとう、あなたが言ったことは正しかったです。しかし、残念ながら私は1つの答えしか受け入れることができません。だから私はupvotingに出発します。 – user763410

0

読み取り/書き込みモードでファイルを開くことができます。あなたはファイルを読んだり(またはあなたが知っているなら、あなたが望む位置にジャンプするために "シーク"を使って)、ファイルに書き込むが、ここにあるデータを上書きする(これは挿入ではない)。 最後に書いたポイントからファイルを切り捨てるか、書き留めたポイントの後に残りのデータをすべて残しておくことができます。

3

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

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

+0

ありがとう!あなたの答えは私の質問に合っていますか:http://unix.stackexchange.com/q/281652/9689?私はそこに引用しましたが、それを自分の答えとして追加すると、答えとしてマークして私の見積もりを削除することができます。 :) –

関連する問題