Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】PharData::getFileInfo()メソッドの使い方

getFileInfoメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getFileInfoメソッドは、PharDataアーカイブ内の特定のファイルに関する詳細な情報を取得するメソッドです。

このメソッドはPharDataクラスに属し、TARやZIPなどの形式で圧縮されたアーカイブファイルの中から、アーカイブ全体を展開することなく、その内部に含まれる個々のファイルやディレクトリの属性情報を効率的に参照するために利用されます。システムエンジニアにとって、大量のアーカイブファイルを扱う際や、特定のファイルを処理する前にその情報を確認したい場合に非常に役立ちます。

引数には、情報を取り出したいアーカイブ内のファイルの相対パスを指定します。メソッドが成功すると、PharFileInfoクラスのオブジェクトを返します。このPharFileInfoオブジェクトは、ファイルのサイズ、最終更新日時、パーミッション、圧縮状態など、対象ファイルの様々な情報を含んでいます。これらの情報は、アーカイブ内のファイルが特定の条件を満たすか確認したり、ファイルの中身を読み込む前の準備として活用できます。

例えば、アーカイブ内の特定のファイルのサイズを事前に知りたい場合や、特定の拡張子を持つファイルだけを処理したい場合などに便利です。ただし、指定されたパスのファイルがアーカイブ内に存在しない場合、PHPはBadMethodCallExceptionをスローする可能性があるため、適切なエラーハンドリングを行うことが重要です。

構文(syntax)

1<?php
2$pharData = new PharData('archive.tar');
3$fileInfo = $pharData->getFileInfo('path/to/file.txt');
4?>

引数(parameters)

string $entry

  • string $entry: Pharアーカイブ内のエントリ(ファイルまたはディレクトリ)の名前を指定する文字列

戻り値(return)

PharFileInfo

PharData::getFileInfoは、Pharアーカイブ内の指定されたファイルに関する詳細情報を提供するPharFileInfoオブジェクトを返します。

サンプルコード

PharData::getFileInfo でアーカイブ内ファイル情報を取得する

1<?php
2
3// このサンプルコードは、PharDataアーカイブを作成し、その中の特定ファイルの情報を取得する方法を示します。
4// PharDataは、.tar, .zip などのアーカイブファイルを扱うために使用されます。
5//
6// 注意: Pharアーカイブを作成または変更するには、PHP設定で 'phar.readonly' を '0' に設定する必要があります。
7// CLIで実行する場合、通常は php.ini またはスクリプト内で ini_set() を使用します。
8// 本番環境ではセキュリティ上の理由から 'phar.readonly' は '1' に設定されていることが推奨されます。
9ini_set('phar.readonly', '0');
10
11// 1. テスト用のファイルとアーカイブのパスを定義します。
12$archivePath = __DIR__ . '/my_archive.tar';
13$testFilePath1 = __DIR__ . '/source_file1.txt';
14$testFilePath2 = __DIR__ . '/source_file2.txt';
15
16// 2. 既存のアーカイブやテストファイルをクリーンアップします (スクリプトの再実行時に問題がないように)。
17if (file_exists($archivePath)) {
18    @unlink($archivePath); // @ でエラー出力を抑制
19}
20if (file_exists($testFilePath1)) {
21    unlink($testFilePath1);
22}
23if (file_exists($testFilePath2)) {
24    unlink($testFilePath2);
25}
26
27// 3. アーカイブに追加するためのダミーファイルを作成します。
28file_put_contents($testFilePath1, 'これはアーカイブ内の最初のファイルの内容です。');
29file_put_contents($testFilePath2, 'これはアーカイブ内の二番目のファイルの内容です。');
30
31echo "テストファイルを作成しました。\n";
32
33try {
34    // 4. 新しいPharDataアーカイブを作成します。
35    //    'my_archive.tar' という名前のTAR形式アーカイブを作成します。
36    $phar = new PharData($archivePath);
37
38    // 5. 作成したダミーファイルをアーカイブに追加します。
39    //    addFile(ソースファイルのパス, アーカイブ内のエントリ名)
40    $phar->addFile($testFilePath1, 'path/to/file1.txt');
41    $phar->addFile($testFilePath2, 'path/to/file2.txt');
42
43    echo "PharDataアーカイブ '{$archivePath}' を作成し、ファイルを追加しました。\n\n";
44
45    // 6. アーカイブ内の特定のエントリ(ファイル)の情報を取得します。
46    //    getFileInfo() メソッドは、指定されたアーカイブ内のパスに対応する
47    //    PharFileInfo オブジェクトを返します。
48    $entryName = 'path/to/file1.txt'; // 情報を取得したいアーカイブ内のエントリ名
49
50    if ($phar->offsetExists($entryName)) { // アーカイブ内にそのエントリが存在するか確認
51        echo "アーカイブ内のエントリ '{$entryName}' の情報を取得します:\n";
52        $fileInfo = $phar->getFileInfo($entryName);
53
54        // 7. 取得したPharFileInfoオブジェクトから各種情報を表示します。
55        echo "  - ファイル名 (アーカイブ内): " . $fileInfo->getFilename() . "\n";
56        echo "  - ファイルサイズ: " . $fileInfo->getSize() . " バイト\n";
57        echo "  - 最終変更時刻: " . date('Y-m-d H:i:s', $fileInfo->getMTime()) . "\n";
58        echo "  - CRC32 チェックサム: " . sprintf('%08x', $fileInfo->getCRC32()) . "\n";
59        echo "  - タイプ: " . ($fileInfo->isFile() ? 'ファイル' : ($fileInfo->isDir() ? 'ディレクトリ' : '不明')) . "\n";
60        echo "  - パーミッション: " . substr(sprintf('%o', $fileInfo->getPerms()), -4) . "\n";
61
62        // ファイルの内容を直接読み込むことも可能です(ただし、大きなファイルではメモリ消費に注意)。
63        // echo "  - 内容のプレビュー:\n" . substr($fileInfo->getContent(), 0, 100) . "...\n";
64
65    } else {
66        echo "エラー: アーカイブ内にエントリ '{$entryName}' が見つかりませんでした。\n";
67    }
68
69} catch (Exception $e) {
70    echo "エラーが発生しました: " . $e->getMessage() . "\n";
71} finally {
72    // 8. クリーンアップ: 作成したテストファイルとアーカイブファイルを削除します。
73    //    PharDataオブジェクトをnullにすることで、ファイルロックを解放するのに役立ちます。
74    $phar = null;
75    if (file_exists($testFilePath1)) {
76        unlink($testFilePath1);
77    }
78    if (file_exists($testFilePath2)) {
79        unlink($testFilePath2);
80    }
81    if (file_exists($archivePath)) {
82        // Windows環境などではファイルロックにより即座に削除できない場合があります。
83        @unlink($archivePath);
84        if (file_exists($archivePath)) {
85            echo "\n警告: アーカイブファイル '{$archivePath}' を削除できませんでした。手動で削除してください。\n";
86        } else {
87            echo "\nテスト用ファイルとアーカイブをクリーンアップしました。\n";
88        }
89    } else {
90        echo "\nテスト用ファイルはクリーンアップしましたが、アーカイブは既に削除済みでした。\n";
91    }
92}

PHPのPharData::getFileInfoメソッドは、.tarや.zipなどのアーカイブファイルから、特定のファイルやディレクトリの情報を取得する際に利用されます。このメソッドは、PharDataクラスのインスタンスに対して呼び出され、アーカイブ内のエントリに関する詳細な情報を提供します。

引数にはstring $entryを指定します。これは、情報を取得したい対象のファイルまたはディレクトリの、アーカイブ内におけるパス(エントリ名)を文字列で渡すものです。例えば、アーカイブ内に「images/photo.jpg」というファイルがあれば、その文字列を引数として渡します。

メソッドの実行に成功すると、戻り値としてPharFileInfoオブジェクトが返されます。このオブジェクトからは、対象のファイル名、ファイルサイズ、最終変更時刻、CRC32チェックサム、ファイルタイプ(ファイルかディレクトリか)、パーミッションなど、多岐にわたる詳細なメタデータにアクセスできます。サンプルコードでは、まず新しいTARアーカイブを作成し、ファイルを追加した後、getFileInfoを使ってその追加したファイルの詳細情報を取得し、表示しています。これにより、アーカイブの内容をプログラム的に確認・管理することが可能になります。

Pharアーカイブの作成や変更には、PHP設定の phar.readonly を 0 に設定する必要がありますが、本番環境ではセキュリティのため 1 に設定することが推奨されます。getFileInfo メソッドの引数には、アーカイブ内のファイルパス(エントリ名)を指定してください。このメソッドは PharFileInfo オブジェクトを返し、ファイルサイズや変更時刻などの詳細な情報を取得できます。アーカイブが存在しない、または指定のエントリが見つからない場合、例外が発生するため、必ず try-catch でエラーを処理することが重要です。また、PharDataオブジェクトの操作後はファイルロックが残ることがあり、ファイルを削除する際にはオブジェクトを null にして解放するなどの対応が必要となる場合があります。

関連コンテンツ

関連IT用語

関連プログラミング言語