2

PHPに大きなファイルがあり、最初の512バイトを他の512バイトに置き換えたいと思います。それを助けるPHP関数はありますか?

4

1 に答える 1

10

オプションでファイルを作成し、(切り捨てずに)読み取りと書き込みを行う場合は、次のモードのfopen()関数を使用してファイルを開く必要があります。'c+'

$handle = fopen($filename, 'c+');

PHPにはstream_get_contents()、特定の長さの(およびファイル内の特定のオフセットからの)バイトのチャンクを文字列変数に読み込むことができる関数があります。

$buffer = stream_get_contents($handle, $length = 512, $offset = 0);

ただし、stream_put_contents()文字列バッファを特定の位置/オフセットでストリームに書き戻す機能はありません。関連する関数はですfile_put_contents()が、特定のオフセットでファイルハンドルリソースに書き込むことはできません。しかし、それを行うにはfseek()、次のようなことがあります。fwrite()

$bytes_written = false;
if (0 === fseek($handle, $offset)) {
    $bytes_written = fwrite($handle, $buffer, $length);
}

これが全体像です:

$handle = fopen($filename, 'c+');
$buffer = stream_get_contents($handle, $length = 512, $offset = 0);

// ... change $buffer ...

$bytes_written = false;
if (0 === fseek($handle, $offset)) {
    $bytes_written = fwrite($handle, $buffer, $length);
}
fclose($handle);

の長さが$buffer固定されていない場合、これは正しく機能しません。その場合、2つのファイルで作業し、データベーステーブルヘッダーでcsv列名を更新する方法stream_copy_to_stream()で概説されているように使用することをお勧めします。ファイルが大きくない場合は、メモリ内でそれを行うこともできます。

$buffer = file_get_contents($filename);

// ... change $buffer ...

file_put_contents($filename, $buffer);
于 2013-03-18T09:50:10.357 に答える