2011-12-25 10 views
1

既存のファイルの内容の間に書き込む方法は?PHP:既存のファイルの内容の間に書き込む方法は?

fseek()を使用して新しい位置を探して新しいコンテンツを書き込もうとしましたが、シーク位置の後に古いコンテンツを新しい文字列に置き換えました。

私の目標は、既存のファイルの5文字の後に新しい内容を入れることです。

旧コンテンツ:AAAAABBBBB、所望のコンテンツ:NULLNULLNULLNULLNULLthis is new content

+0

リンクhttp://stackoverflow.com/q/6472408/1338846 –

答えて

1

に置き換えAAAAAnewcontentBBBBB

$file_handler = fopen('putty.log','w'); 
$new_content = 'this is new content'; 

fseek($file_handler,5); 

echo ftell($file_handler); //5 
fwrite($file_handler,$new_content); 

古いコンテンツあなたはそのように行うことはできません。

だけです)(ftruncateのでコンテンツを切り捨てるとのfile_get_contentsを使用して変数に

Aそれほどきれいではない例

<?php 

$file_handler = fopen('putty.log','rb+'); 
$new_content = 'this is new content'; 

fseek($file_handler,5); 

$restOfContent = fread($file_handler,filesize('putty.log')-5); 

ftruncate($file_handler,5); 
fseek($file_handler,5); 

echo ftell($file_handler); //5 
fwrite($file_handler,$new_content); 

fwrite($file_handler,$restOfContent); 

fclose($file_handler) 
+0

少しコードください。 –

+0

fread($ file_handler、filesize( 'putty.log') - 5);の後にrewind()する必要はありません私たちがもう一度やり直したらEOFを読んだ後、それは最初から始まりますか? –

+0

私はファイルポインタがEOFに到達し、私が再びシークすると思います、それは0から始まります。 –

1
  1. ロードの内容を後から古いコンテンツを書くことができます。
  2. バッファでこれを行います。
  3. file_put_contents();を使用してこのファイルにコンテンツを保存します。
+0

それはファイルが巨大であればメモリの負担です。 –

+0

はい、しかし最速の開発;-)多分これはあなたがそれに費やしているあなたの時間に関連してより良い解決策になる可能性があるので、コードが生涯でどのように使用されるか考えてください – Svisstack

1

あなたは "R +" モード、一例では、ファイルを開くために覚えて、ファイルにデータを書き込むためのfseek()を使用している場合:

$ FP =のfopen($ファイル名、」 r + ");ファイルの途中に

+0

ありがとう、私はwモードは常にゼロ長さ。 –

+0

wは実際に既存のファイルを上書きします。 – ALH

1

書き込みは、それは伸ばし、あなたが書き込みを開始位置のコンテンツを上書きするというが、(テキストエディタでコンテンツを挿入するときのように)前方にコンテンツをプッシュすることはありません。あなたがする必要がどのような は次のとおりです。

  1. あなたは一時ファイルにその部分を書く新しいコンテンツ&を記述する必要があるポイントまで、古いデータの最初の部分をお読みください。
  2. 新しいコンテンツをテンポラリファイル(追加するもの)に書き込みます。
  3. 古いファイルから残りのコンテンツを読み込み、一時ファイルに書き込みます。
  4. 古いファイルを削除します。
  5. 一時ファイルの名前を古いファイルの名前に変更します。

例:

$original_file_name = '/tmp/putty.log'; 
$temp_file_name = '/tmp/putty.tmp'; 
$temp_file = fopen($temp_file_name, 'w'); 
$file_handler = fopen($original_file_name, 'r'); 
$old_data_size = 5; 
fwrite($temp_file, fread($file_handler, $old_data_size)); 
$new_content = 'this is new content'; 
fwrite($temp_file, $new_content, strlen($new_content)); 
fwrite($temp_file, fread($file_handler, filesize($original_file_name) - $old_data_size)); 
fclose($file_handler); 
fclose($temp_file); 
unlink($original_file_name); 
rename($temp_file_name, $original_file_name); 

putty.logは(などのapache/lighttpdの)あなたのウェブサーバで使用するユーザプロセスのか、それは誰のためにアクセス可能だという読み取り/書き込み権限をしていることを確認します(推奨されません)。

+0

ありがとうございました.. –

関連する問題