PHPでディレクトリ内のファイルを簡単に一覧表示する方法

PHPでディレクトリ内のファイル一覧を取得することは、ファイル管理システムやウェブアプリケーションの作成において非常に有用です。例えば、特定のフォルダ内にある画像を一括表示するギャラリーや、アップロードされたファイルのリストを表示する機能などで役立ちます。この記事では、PHPでディレクトリ内のファイルを一覧表示するための基本的な手法として、scandiropendir、およびreaddir関数の使い方と、応用例について詳しく解説していきます。これにより、ディレクトリ内のファイルを柔軟に操作し、効率的に表示するための方法を習得できます。

目次

scandir関数の使い方


scandir関数は、指定したディレクトリ内のファイルとフォルダを簡単に配列として取得する便利なPHP関数です。この関数を使用すると、ディレクトリの内容をスキャンして一覧として表示できます。

scandirの基本構文


scandir関数の基本的な構文は以下の通りです。

$files = scandir('ディレクトリパス');

$filesには、指定したディレクトリ内のファイルとフォルダの名前が配列として格納されます。例えば、scandir('images')とすることで、imagesフォルダ内の全てのファイルとサブフォルダを取得できます。

ディレクトリの内容を取得して表示する例


以下は、scandir関数を使用してディレクトリ内のファイルとフォルダを一覧表示するコードの例です。

$directory = 'images';
$files = scandir($directory);

foreach ($files as $file) {
    echo $file . "<br>";
}

このコードは、指定したディレクトリ内のすべてのファイルとフォルダの名前を表示します。結果には、必ず.(カレントディレクトリ)と..(親ディレクトリ)も含まれるため、リスト表示の際は注意が必要です。

scandirのオプション引数


scandir関数には、第2引数でソート順を指定するオプションがあり、以下のように使用できます。

$files = scandir($directory, SCANDIR_SORT_DESCENDING);

SCANDIR_SORT_DESCENDINGで降順に並び替えられ、SCANDIR_SORT_ASCENDING(デフォルト)で昇順になります。これにより、ファイルやフォルダの順序を調整しながら一覧を取得できます。

scandir関数の応用例


scandir関数はディレクトリ内のファイルを一覧表示するだけでなく、条件に応じてフィルタリングや並べ替えを行うことも可能です。このセクションでは、特定のファイルのみを表示したり、並び替えを行ったりするための応用例を紹介します。

特定のファイルタイプのみを表示する


ディレクトリ内のすべてのファイルを表示するのではなく、特定の拡張子を持つファイルのみを表示するには、scandirで取得した配列をループ処理し、ファイルの拡張子をチェックする方法が効果的です。

$directory = 'images';
$files = scandir($directory);

foreach ($files as $file) {
    if (pathinfo($file, PATHINFO_EXTENSION) == 'jpg') {
        echo $file . "<br>";
    }
}

この例では、imagesフォルダ内の.jpgファイルのみを表示します。他の拡張子(.png.txtなど)を表示したい場合は、条件を変更するだけで対応できます。

ファイルサイズによるフィルタリング


特定のサイズ以上や以下のファイルを表示したい場合は、filesize関数を用いることができます。以下は、1MB(1048576バイト)以上のファイルのみを一覧表示する例です。

foreach ($files as $file) {
    if (is_file("$directory/$file") && filesize("$directory/$file") > 1048576) {
        echo $file . "<br>";
    }
}

このコードは、指定したサイズ条件に適合するファイルのみを表示します。サイズに応じた表示が必要な場合に便利です。

ファイルの更新日時で並べ替える


ファイルを更新日時順に並べて表示することも可能です。以下は、取得したファイルを更新日時でソートして表示する例です。

$files = array_diff(scandir($directory), array('.', '..'));
usort($files, function ($a, $b) use ($directory) {
    return filemtime("$directory/$b") - filemtime("$directory/$a");
});

foreach ($files as $file) {
    echo $file . " - 更新日時: " . date("Y-m-d H:i:s", filemtime("$directory/$file")) . "<br>";
}

この例では、ファイルの更新日時が新しい順に並べ替え、ファイル名と更新日時を表示しています。これにより、最新のファイルを一覧の上に表示することができます。

ファイル一覧をJSON形式で取得する


APIレスポンスや他のシステムで活用できるよう、ファイル一覧をJSON形式に変換することも便利です。以下は、取得したファイル名をJSONに変換する例です。

$filesArray = array_values(array_diff($files, array('.', '..')));
$jsonFiles = json_encode($filesArray);

echo $jsonFiles;

このコードは、ディレクトリ内のファイル名をJSON形式で出力します。これにより、JavaScriptや他のシステムでデータを容易に扱えるようになります。

opendir関数とreaddir関数の使い方


opendirreaddir関数は、ディレクトリ操作において基本的な役割を持つPHP関数です。scandirよりも低レベルな操作が可能で、より細かく制御したい場合に役立ちます。このセクションでは、それぞれの関数の基本的な使い方について解説します。

opendir関数の基本構文


opendir関数は指定したディレクトリを開き、そのディレクトリへのハンドル(ポインタ)を返します。このハンドルを利用してreaddir関数を用い、ディレクトリ内のファイルやフォルダを1つずつ読み取ることができます。

$directory = 'images';
$dirHandle = opendir($directory);

opendir関数はディレクトリのハンドルを返し、指定したディレクトリを開けない場合はfalseを返します。この関数は、複数のディレクトリを連続して操作する場合に便利です。

readdir関数を使用してディレクトリ内容を取得する


readdir関数を用いると、開いたディレクトリ内のエントリを1つずつ取得できます。opendirで開いたハンドルを使用して、readdirで順次ファイルやフォルダを読み込む方法は以下の通りです。

if ($dirHandle) {
    while (($file = readdir($dirHandle)) !== false) {
        echo $file . "<br>";
    }
    closedir($dirHandle);
}

このコードは、指定したディレクトリ内のファイルやフォルダを1行ずつ表示します。最後にclosedir関数でディレクトリを閉じることで、リソースの無駄遣いを防ぎます。

不要なエントリを除外する


readdirでディレクトリ内容を読み込むと、.(カレントディレクトリ)と..(親ディレクトリ)も含まれます。不要なエントリを除外するためには、以下のように条件分岐を追加します。

if ($dirHandle) {
    while (($file = readdir($dirHandle)) !== false) {
        if ($file !== "." && $file !== "..") {
            echo $file . "<br>";
        }
    }
    closedir($dirHandle);
}

このコードでは、...をスキップし、必要なファイルやフォルダのみを表示します。これにより、ディレクトリの内容が見やすくなります。

opendirとreaddirの利点


opendirreaddirを用いると、ファイルやフォルダを逐次処理できるため、大量のファイルがある場合でも効率よく操作可能です。メモリ消費量が少なくなる点がscandirに対する利点といえます。ファイル数が多い場合や、特定の条件に基づいて逐次処理を行いたい場合には、この組み合わせが特に適しています。

ファイルの種類別にフィルタリングする方法


ディレクトリ内のすべてのファイルを表示するのではなく、特定のファイル形式や種類に絞って表示することがよくあります。PHPでは、ファイルの拡張子やタイプによってフィルタリングを行うことで、目的のファイルだけを効率よく一覧表示できます。ここでは、その実現方法を解説します。

拡張子によるフィルタリング


特定の拡張子(例:画像ファイルやドキュメントファイル)を持つファイルのみを表示するには、pathinfo関数で拡張子を取得し、条件分岐でフィルタリングを行います。

$directory = 'documents';
$files = scandir($directory);

foreach ($files as $file) {
    if (pathinfo($file, PATHINFO_EXTENSION) == 'pdf') {
        echo $file . "<br>";
    }
}

この例では、documentsフォルダ内の.pdfファイルのみを表示します。他のファイル拡張子(例:.docx.txt)を指定したい場合は、pathinfoの条件を変更することで対応可能です。

複数の拡張子を持つファイルのフィルタリング


複数の種類のファイルを表示したい場合は、配列を用いて条件分岐を設定します。以下の例は、画像ファイル(.jpg.png)のみを一覧表示します。

$imageExtensions = ['jpg', 'png'];
foreach ($files as $file) {
    if (in_array(pathinfo($file, PATHINFO_EXTENSION), $imageExtensions)) {
        echo $file . "<br>";
    }
}

このコードは、拡張子がjpgまたはpngのファイルのみを一覧表示します。これにより、特定のファイル形式に絞った表示が可能になります。

ファイルタイプ別にフィルタリングする


ファイルがフォルダなのか、実際のファイルなのかを区別する場合には、is_fileis_dir関数を使用します。これにより、ディレクトリ内のファイルとフォルダを分けて表示することができます。

foreach ($files as $file) {
    if (is_file("$directory/$file")) {
        echo "ファイル: $file <br>";
    } elseif (is_dir("$directory/$file") && $file !== '.' && $file !== '..') {
        echo "フォルダ: $file <br>";
    }
}

この例では、ファイルとフォルダをそれぞれ区別して表示しています。特にサブフォルダが多い場合やファイルとフォルダを明確に分けたい場合に便利です。

フィルタリング結果を配列に格納する


条件に合うファイルのみを配列に格納して、後から一括で操作することも可能です。例えば、画像ファイルだけをまとめて取得したい場合には以下のようにします。

$filteredFiles = [];

foreach ($files as $file) {
    if (in_array(pathinfo($file, PATHINFO_EXTENSION), $imageExtensions)) {
        $filteredFiles[] = $file;
    }
}

print_r($filteredFiles); // 配列として出力

このコードは、条件に一致したファイルだけを$filteredFiles配列に追加します。取得したファイルを他の処理に活用したい場合に有効です。

ファイル一覧を表形式で表示する方法


取得したファイル一覧をわかりやすく表示するために、HTMLのテーブルを使って表形式で表示する方法があります。これにより、ファイル名だけでなく、ファイルサイズや更新日時などの追加情報を視覚的に整理できます。

基本的なHTMLテーブルの構成


まず、PHPで取得したファイルリストをテーブル形式で出力するためのHTML構成を定義します。ここでは、ファイル名、ファイルサイズ、更新日時の3つの情報をテーブルに表示します。

$directory = 'files';
$files = array_diff(scandir($directory), array('.', '..')); // '.'と'..'を除外

echo "<table border='1'>";
echo "<tr><th>ファイル名</th><th>ファイルサイズ</th><th>更新日時</th></tr>";

foreach ($files as $file) {
    $filePath = "$directory/$file";
    echo "<tr>";
    echo "<td>" . htmlspecialchars($file) . "</td>";
    echo "<td>" . filesize($filePath) . " bytes</td>";
    echo "<td>" . date("Y-m-d H:i:s", filemtime($filePath)) . "</td>";
    echo "</tr>";
}

echo "</table>";

このコードでは、scandir関数を使って指定ディレクトリのファイル一覧を取得し、各ファイルに対してテーブル行(<tr>...</tr>)を作成します。

テーブルの各項目の詳細

  • ファイル名: htmlspecialchars関数を使ってHTMLエンティティに変換し、安全にファイル名を表示します。
  • ファイルサイズ: filesize関数を使用してファイルのサイズを取得し、バイト単位で表示します。
  • 更新日時: filemtime関数を使い、ファイルの最終更新日時をY-m-d H:i:sの形式で表示します。

CSSを用いたスタイルの追加


表の見た目を整えるために、簡単なCSSを追加することもできます。以下は、テーブルにスタイルを適用する例です。

<style>
    table {
        width: 100%;
        border-collapse: collapse;
    }
    th, td {
        padding: 8px;
        text-align: left;
        border: 1px solid #ddd;
    }
    th {
        background-color: #f2f2f2;
    }
    tr:nth-child(even) {
        background-color: #f9f9f9;
    }
</style>

このCSSを用いると、表が整然とし、行ごとに色が交互に変わるため、視認性が向上します。

テーブル表示の実行例


この構成で実行すると、以下のようなテーブルが表示されます。

ファイル名ファイルサイズ更新日時
example.jpg204800 bytes2024-10-28 13:45:30
sample.pdf102400 bytes2024-10-28 09:30:15

このように表形式で一覧を表示することで、視覚的に情報が整理され、ユーザーにとっても使いやすい表示方法が実現できます。

隠しファイルや特定のファイルを除外する方法


ディレクトリ内のファイルを一覧表示する際に、不要な隠しファイルや特定のファイル(例:システムファイルやテンポラリファイル)を除外したい場合があります。PHPでは、条件を追加して特定のファイルを除外する方法が簡単に実装できます。以下に、その具体的な方法を紹介します。

隠しファイルを除外する


隠しファイルとは、ファイル名の先頭に.(ドット)がついているファイルのことです。これらのファイルを一覧から除外するには、ファイル名の先頭をチェックし、.で始まるファイルをスキップする条件を追加します。

$directory = 'files';
$files = scandir($directory);

foreach ($files as $file) {
    // ファイル名が`.`で始まる場合はスキップ
    if (substr($file, 0, 1) === '.') {
        continue;
    }
    echo $file . "<br>";
}

このコードでは、ファイル名の先頭文字が.の場合はcontinue文でスキップするようにしています。これにより、隠しファイルが表示されなくなります。

特定のファイル名やパターンで除外する


特定のファイル名やパターン(例:一時ファイルやバックアップファイル)を除外したい場合もあります。その際は、ファイル名に特定の文字列が含まれているかをチェックし、条件を追加して除外します。

$excludedPatterns = ['backup', 'temp'];
foreach ($files as $file) {
    $skip = false;
    foreach ($excludedPatterns as $pattern) {
        if (strpos($file, $pattern) !== false) {
            $skip = true;
            break;
        }
    }
    if ($skip) {
        continue;
    }
    echo $file . "<br>";
}

この例では、ファイル名にbackuptempといった文字列が含まれている場合は、表示から除外します。複数のパターンに基づいて柔軟に除外条件を設定できるため、用途に合わせたフィルタリングが可能です。

特定の拡張子を持つファイルを除外する


特定の拡張子(例:ログファイルや一時ファイルなど)を持つファイルを除外したい場合は、pathinfoを利用して拡張子を取得し、該当する場合にスキップします。

$excludedExtensions = ['log', 'tmp'];
foreach ($files as $file) {
    if (in_array(pathinfo($file, PATHINFO_EXTENSION), $excludedExtensions)) {
        continue;
    }
    echo $file . "<br>";
}

このコードでは、logtmpといった拡張子のファイルは表示しません。これにより、無駄なファイルを一覧から取り除き、必要なファイルのみを表示することが可能です。

応用例:複数条件でファイルを除外する


隠しファイルや特定のパターン、特定の拡張子のファイルを同時に除外したい場合は、これらの条件を組み合わせます。

$excludedExtensions = ['log', 'tmp'];
$excludedPatterns = ['backup', 'temp'];

foreach ($files as $file) {
    if (substr($file, 0, 1) === '.' || 
        in_array(pathinfo($file, PATHINFO_EXTENSION), $excludedExtensions) || 
        array_reduce($excludedPatterns, fn($carry, $pattern) => $carry || strpos($file, $pattern) !== false, false)) {
        continue;
    }
    echo $file . "<br>";
}

このコードは、隠しファイル、特定の拡張子、特定のパターンを含むファイルをすべて除外し、指定した条件を満たさないファイルのみを表示します。条件を組み合わせることで、より精緻なフィルタリングが可能になります。

PHPとJavaScriptで動的なファイル一覧を表示


PHPとJavaScriptを組み合わせることで、ディレクトリ内のファイル一覧を動的に表示し、ページのリロードをせずに更新する機能を実装できます。この方法では、PHPがサーバーサイドでファイル情報を取得し、JavaScriptがフロントエンドで表示を制御します。ここでは、PHPとJavaScriptによる動的なファイル一覧表示方法について説明します。

PHPでファイル一覧をJSON形式で取得する


まず、PHPスクリプトでディレクトリ内のファイル情報をJSON形式で出力し、JavaScriptがそのデータを受け取れるようにします。

// get_files.php
$directory = 'files';
$files = array_diff(scandir($directory), array('.', '..'));

$fileList = [];
foreach ($files as $file) {
    $fileList[] = [
        'name' => $file,
        'size' => filesize("$directory/$file"),
        'modified' => date("Y-m-d H:i:s", filemtime("$directory/$file"))
    ];
}

header('Content-Type: application/json');
echo json_encode($fileList);

このコードでは、指定したディレクトリ内のファイル情報を配列に格納し、JSON形式で出力しています。このget_files.phpを呼び出すと、ファイル名、サイズ、更新日時が含まれたJSONデータが返されます。

JavaScriptでファイル一覧を取得して表示する


次に、JavaScriptでget_files.phpを非同期で呼び出し、ファイル情報を取得してページに表示します。以下のコードでは、fetch APIを使用しています。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>動的ファイル一覧</title>
</head>
<body>

<h2>ディレクトリ内のファイル一覧</h2>
<table border="1" id="fileTable">
    <tr>
        <th>ファイル名</th>
        <th>ファイルサイズ</th>
        <th>更新日時</th>
    </tr>
</table>

<script>
    function fetchFileList() {
        fetch('get_files.php')
            .then(response => response.json())
            .then(data => {
                const table = document.getElementById('fileTable');
                table.innerHTML = `
                    <tr>
                        <th>ファイル名</th>
                        <th>ファイルサイズ</th>
                        <th>更新日時</th>
                    </tr>
                `;

                data.forEach(file => {
                    const row = document.createElement('tr');
                    row.innerHTML = `
                        <td>${file.name}</td>
                        <td>${file.size} bytes</td>
                        <td>${file.modified}</td>
                    `;
                    table.appendChild(row);
                });
            })
            .catch(error => console.error('Error fetching file list:', error));
    }

    // ページロード時にファイル一覧を取得
    window.onload = fetchFileList;
</script>

</body>
</html>

このHTMLコードでは、JavaScriptのfetchFileList関数を用いてget_files.phpを呼び出し、JSON形式で返されたファイル情報をテーブル形式で表示しています。window.onloadイベントでページの読み込み時にファイル一覧を取得します。

ファイル一覧の自動更新


さらに、定期的にファイル一覧を更新することで、ファイルの変更をリアルタイムに反映できます。以下は、一定間隔(例:5秒)でfetchFileListを再実行し、ファイルリストを自動更新する例です。

setInterval(fetchFileList, 5000);  // 5秒ごとにファイル一覧を更新

このコードを追加することで、ユーザーはページをリロードせずにファイルの更新状況を確認できます。

動的ファイル一覧表示の利点


PHPとJavaScriptを組み合わせることで、ユーザーがページをリロードすることなく、リアルタイムでディレクトリ内のファイルを確認できる便利なインターフェースが実現できます。これにより、ファイルの追加や更新が頻繁に行われるアプリケーションにおいて、ユーザー体験が向上します。

エラーハンドリングの実装方法


ディレクトリ内のファイルを取得する際、権限不足や指定ディレクトリの存在しない場合など、さまざまなエラーが発生する可能性があります。PHPでエラーハンドリングを実装することで、これらの問題に対する対応を行い、ユーザーにわかりやすいエラーメッセージを表示することができます。ここでは、PHPでのエラーハンドリングの具体的な方法について解説します。

ディレクトリが存在しない場合の対処


指定したディレクトリが存在しない場合、scandiropendirを呼び出すとエラーが発生します。まず、ディレクトリの存在を確認し、存在しない場合にはエラーメッセージを表示する方法を見てみましょう。

$directory = 'files';

if (!is_dir($directory)) {
    echo "エラー: 指定されたディレクトリが存在しません。";
} else {
    $files = scandir($directory);
    foreach ($files as $file) {
        echo $file . "<br>";
    }
}

このコードでは、is_dir関数を使用してディレクトリの存在を確認し、ディレクトリが存在しない場合にエラーメッセージを表示します。これにより、不正なディレクトリ指定によるエラーを防ぐことができます。

ファイル読み取り権限がない場合の対処


ディレクトリが存在しても、ファイルの読み取り権限がない場合にエラーが発生することがあります。この場合、is_readable関数を使用して読み取り可能かどうかを確認します。

if (!is_readable($directory)) {
    echo "エラー: ディレクトリに読み取り権限がありません。";
} else {
    $files = scandir($directory);
    foreach ($files as $file) {
        echo $file . "<br>";
    }
}

このコードでは、読み取り権限がない場合に警告を表示します。これにより、ユーザーが権限に関するエラーを認識し、対処できるようにします。

try-catch構文を用いたエラーハンドリング


PHP 7以降では、エラーハンドリングに例外処理を使うこともできます。例外処理はエラー発生時にコードの実行を中断し、指定したエラーメッセージを表示するための強力な手段です。

try {
    if (!is_dir($directory)) {
        throw new Exception("エラー: 指定されたディレクトリが存在しません。");
    }
    if (!is_readable($directory)) {
        throw new Exception("エラー: ディレクトリに読み取り権限がありません。");
    }

    $files = scandir($directory);
    foreach ($files as $file) {
        echo $file . "<br>";
    }
} catch (Exception $e) {
    echo $e->getMessage();
}

この例では、throw文を使って例外を発生させ、エラーの詳細を表示するcatchブロックでキャッチしています。これにより、複数のエラーパターンを統一的に管理でき、エラー時の動作を明確に制御できます。

エラーログへの記録


エラー発生時にエラーログに記録することで、開発者は詳細なエラーレポートを確認できるようになります。以下のコードは、エラーメッセージをログファイルに記録する方法を示しています。

function logError($message) {
    error_log($message, 3, 'error_log.txt');
}

try {
    if (!is_dir($directory)) {
        throw new Exception("エラー: 指定されたディレクトリが存在しません。");
    }
    if (!is_readable($directory)) {
        throw new Exception("エラー: ディレクトリに読み取り権限がありません。");
    }

    $files = scandir($directory);
    foreach ($files as $file) {
        echo $file . "<br>";
    }
} catch (Exception $e) {
    echo $e->getMessage();
    logError($e->getMessage());
}

このコードでは、エラーメッセージをerror_log.txtに記録します。これにより、発生したエラーの情報が記録され、開発者が問題を追跡できるようになります。

エラーハンドリングの重要性


PHPでファイル操作を行う際のエラーハンドリングは、ユーザーに対してわかりやすいエラーメッセージを提供し、エラー発生時の挙動を制御するために欠かせません。適切なエラーハンドリングを実装することで、アプリケーションの信頼性が向上し、ユーザー体験も改善されます。

よくあるトラブルシューティング


PHPでディレクトリ内のファイル一覧を表示する際、さまざまな問題が発生する可能性があります。ここでは、よくあるトラブルとその解決方法を説明します。

問題1: ディレクトリが見つからないエラー


エラー内容: Warning: scandir(ディレクトリ名): failed to open dir: No such file or directory

原因: 指定されたディレクトリが存在しないか、ディレクトリパスが間違っています。

解決策: is_dir関数を用いてディレクトリが存在するかを確認し、エラー時には適切なメッセージを表示します。

$directory = 'images';
if (!is_dir($directory)) {
    echo "エラー: 指定されたディレクトリが存在しません。";
} else {
    $files = scandir($directory);
    // ファイル一覧の処理
}

問題2: ファイルが表示されない


エラー内容: ファイル一覧が空になる、または特定のファイルのみが表示されない。

原因: 隠しファイルや特定の拡張子が除外されている、またはファイルの読み取り権限がない場合があります。

解決策: 必要に応じて、隠しファイルや拡張子のフィルタリング条件を確認します。また、ファイルの存在や読み取り権限を確認するためにis_readableを使用します。

if (!is_readable($directory)) {
    echo "エラー: ディレクトリに読み取り権限がありません。";
} else {
    $files = scandir($directory);
    // ファイル一覧の処理
}

問題3: パーミッションエラー


エラー内容: Warning: opendir(ディレクトリ名): failed to open dir: Permission denied

原因: サーバー側の設定でディレクトリの読み取り権限が制限されています。

解決策: ディレクトリやファイルのパーミッション設定を確認し、ウェブサーバー(例:ApacheやNginx)ユーザーが読み取り権限を持っていることを確認します。UNIX系システムでのパーミッション設定は以下のコマンドを使います。

chmod -R 755 ディレクトリ名

問題4: 特定のファイルのみが表示されない


エラー内容: 指定した拡張子のファイルが表示されない。

原因: scandirで取得したファイルリストがフィルタリングされている、または特定のファイルの読み取り権限がない可能性があります。

解決策: 条件分岐を確認し、ファイルの読み取り権限を確認します。フィルタリング条件を見直し、目的の拡張子を除外しないようにします。

$allowedExtensions = ['jpg', 'png'];
$directory = 'images';
$files = scandir($directory);

foreach ($files as $file) {
    if (in_array(pathinfo($file, PATHINFO_EXTENSION), $allowedExtensions)) {
        echo $file . "<br>";
    }
}

問題5: ファイルの更新日時が正しく表示されない


エラー内容: ファイルの更新日時が正確でない、または全てのファイルで同じ日時が表示される。

原因: filemtime関数が正しいタイムスタンプを返していない場合があります。

解決策: filemtime関数で取得するタイムスタンプが正確でない場合は、ファイルシステムのタイムゾーン設定を確認します。PHPのdate_default_timezone_setを使用してタイムゾーンを適切に設定することも有効です。

date_default_timezone_set('Asia/Tokyo'); // タイムゾーンを設定
$directory = 'images';
$files = scandir($directory);

foreach ($files as $file) {
    echo date("Y-m-d H:i:s", filemtime("$directory/$file")) . "<br>";
}

まとめ


PHPでディレクトリ内のファイル一覧を操作する際には、ディレクトリやファイルの存在確認、パーミッション設定、フィルタリング条件など、基本的なポイントを押さえることで、エラーの発生を防ぐことができます。各種エラーの原因を理解し、適切なエラーハンドリングを実装することで、安定したファイル操作が可能となります。

演習問題:指定ディレクトリのファイル一覧表示スクリプト作成


ここまでで、PHPを用いたディレクトリ内のファイル一覧表示方法やエラーハンドリングについて学びました。実際に手を動かしながら学びを深めるために、演習として「指定ディレクトリ内のファイルを一覧表示するスクリプト」を作成してみましょう。以下の要件に沿ってスクリプトを実装してみてください。

演習要件

  1. ディレクトリの指定: 任意のディレクトリを指定し、その中のファイル一覧を表示できるようにする。
  2. ファイルの基本情報表示: ファイル名、ファイルサイズ、更新日時を表形式で表示する。
  3. フィルタリング機能: 特定の拡張子(例:画像ファイルのみ)でファイルをフィルタリングする機能を追加する。
  4. エラーハンドリング: ディレクトリが存在しない場合や読み取り権限がない場合に、適切なエラーメッセージを表示する。
  5. スタイルの適用: HTMLとCSSを使用して、テーブル形式でわかりやすく表示する。

スクリプト例

以下に演習の参考例を示します。この例をもとに、自分の環境に合わせて実装してみてください。

<?php
// 演習:指定ディレクトリのファイル一覧を表示するスクリプト

// ディレクトリの指定
$directory = 'images'; // ここで指定するディレクトリを変更できます

// エラーハンドリング
if (!is_dir($directory)) {
    echo "エラー: 指定されたディレクトリが存在しません。";
    exit;
}

if (!is_readable($directory)) {
    echo "エラー: ディレクトリに読み取り権限がありません。";
    exit;
}

// ファイル情報の取得
$files = array_diff(scandir($directory), array('.', '..'));

// HTMLとCSSでテーブル表示
echo "<style>
        table { width: 100%; border-collapse: collapse; }
        th, td { padding: 8px; text-align: left; border: 1px solid #ddd; }
        th { background-color: #f2f2f2; }
        tr:nth-child(even) { background-color: #f9f9f9; }
      </style>";

echo "<table>";
echo "<tr><th>ファイル名</th><th>ファイルサイズ</th><th>更新日時</th></tr>";

$allowedExtensions = ['jpg', 'png', 'gif']; // 表示する拡張子を指定

foreach ($files as $file) {
    // 拡張子でフィルタリング
    if (!in_array(pathinfo($file, PATHINFO_EXTENSION), $allowedExtensions)) {
        continue;
    }

    $filePath = "$directory/$file";
    echo "<tr>";
    echo "<td>" . htmlspecialchars($file) . "</td>";
    echo "<td>" . filesize($filePath) . " bytes</td>";
    echo "<td>" . date("Y-m-d H:i:s", filemtime($filePath)) . "</td>";
    echo "</tr>";
}

echo "</table>";

課題ポイント

  1. ファイルフィルタリングのカスタマイズ: $allowedExtensionsに異なる拡張子(例:pdftxt)を追加し、表示ファイルを変更してみましょう。
  2. エラーの記録: 発生したエラーを画面に表示するだけでなく、ログファイルに記録する処理を追加してみましょう。
  3. 自動更新機能: JavaScriptを利用して、一定時間ごとにファイル一覧を自動で更新する機能を追加し、最新のファイル状態が確認できるようにしてみましょう。

実践における確認事項

  • ディレクトリ指定の柔軟性: $directory変数を変更することで、異なるディレクトリのファイルも表示できるようになっているか。
  • フィルタリング条件の応用: 特定のファイルのみ表示されるようにフィルタリング条件が正しく適用されているか。
  • エラーハンドリングの正確性: 存在しないディレクトリや読み取り権限がない場合に、適切なエラーメッセージが表示されているか。

この演習を通じて、ディレクトリ内のファイル操作や、柔軟なフィルタリング、エラーハンドリングの技術がさらに身につくはずです。スクリプトを完成させたら、表示されたテーブルが期待通りの内容になっているか確認し、必要に応じて改善してみてください。

まとめ


本記事では、PHPを用いてディレクトリ内のファイルを一覧表示する方法について詳しく解説しました。基本的な関数であるscandiropendir、およびreaddirを活用し、ファイルのフィルタリングやエラーハンドリングの実装方法も紹介しました。また、JavaScriptと連携することで動的な表示機能も実現し、実際の開発現場で役立つ技術が身につきます。ファイル操作を柔軟に行える知識は、PHPによるアプリケーション開発において重要ですので、ぜひ活用してみてください。

コメント

コメントする

目次