gzseek

関数の概要

gzseek は、PHPで圧縮されたgzファイルの読み書き時に使用するファイルポインタを指定した位置に移動するための関数です。通常のファイル操作で使う fseek に似ていますが、gz圧縮ファイル専用に設計されています。

パラメータの説明

  • $zp : resource

    gzファイルをオープンした際に返されるリソースハンドルを指定します。
  • $offset : int

    ファイルポインタを移動したいオフセット(バイト数)を指定します。
  • $whence : int(省略可能、デフォルトは SEEK_SET)

    開始位置の基準を指定します。以下の定数を使います。

    • SEEK_SET (0) :ファイルの先頭からのオフセット
    • SEEK_CUR (1) :現在のファイルポインタからのオフセット
    • SEEK_END (2) :ファイルの終端からのオフセット

戻り値

成功すると 0 を返し、失敗すると -1 を返します。失敗するケースとしてはファイルポインタが範囲外に移動しようとした場合などが挙げられます。

使用例

基本的な使い方

<?php
$zp = gzopen('example.gz', 'r');
if (!$zp) {
    die('ファイルを開けませんでした。');
}

// ファイル先頭から10バイト目に移動
if (gzseek($zp, 10) === 0) {
    echo "ファイルポインタを10バイト目に移動しました。n";
} else {
    echo "移動に失敗しました。n";
}

gzclose($zp);
?>

gzファイルを読み込みモードで開き、ファイルの先頭から10バイト目にファイルポインタを移動しています。成功していればメッセージを出力します。

現在位置からの移動

<?php
$zp = gzopen('example.gz', 'r');
gzseek($zp, 15); // 先頭から15バイト目へ
if (gzseek($zp, 5, SEEK_CUR) === 0) {
    echo "現在位置から5バイト進みました。n";
}
gzclose($zp);
?>

まず先頭から15バイト目に移動し、その後現在の位置からさらに5バイト進めています。SEEK_CUR を使うことで現在のファイルポインタ基準の相対移動が可能です。

ファイル終端からの移動

<?php
$zp = gzopen('example.gz', 'r');
if (gzseek($zp, -10, SEEK_END) === 0) {
    echo "ファイル終端から10バイト前に移動しました。n";
}
gzclose($zp);
?>

ファイルの終端から逆方向に10バイト分だけ戻る位置にファイルポインタを移動しています。

関連する関数

  • gzopen : gzファイルを開く
  • gzread : gzファイルから読み込み
  • gzwrite : gzファイルへ書き込み
  • gzclose : gzファイルを閉じる
  • ftell : ファイルポインタの現在位置を取得(通常ファイル用)

まとめ

gzseek はPHPで圧縮されたgz形式のファイル内の読み書き位置を自由に操作できる便利な関数です。ファイルの先頭・現在位置・終端を基準にして位置を指定できるため、部分的なデータ読み込みや書き込みに役立ちます。gzファイルを扱う際は必ずgzopenで正しいモードで開き、使い終わったらgzcloseでリソースを解放しましょう。