topic: file-io (read / write / CSV / paths / upload概念) / ch05
ch05 — パス操作とディレクトリ走査
学習目標
__DIR__/__FILE__の違いを言えるdirname/basename/pathinfoで パスを 分解 できるscandirでディレクトリ内のファイル一覧を取れる (./..の除外も含む)realpathで 絶対パスに正規化 できると知っている
所要時間
スライド = 5 分 / ドリル = 約 20 分
ドリル
| # | 内容 |
|---|---|
01-path-info/ |
与えられたパス文字列を分解して各部分 (dir / basename / filename / extension) を出力 |
02-list-dir/ |
tests/data/sample/ 配下のファイル名一覧 (. .. を除く) をソートして出力 |
採点
php scripts/grade.php topics/14-file-io/ch05-paths/drill/01-path-info/
php scripts/grade.php topics/14-file-io/ch05-paths/drill/02-list-dir/
確認のコツ
pathinfoは 連想配列 (dirname/basename/filename/extension) を返すscandirの戻り値には.(カレント)・..(親) が必ず混ざる。array_diff($files, ['.', '..'])で除く- ファイル一覧を アルファベット順 で揃えたいなら
sort($files)を明示する (環境依存を消す)
演習問題の詳細
この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。
ドリル 01 — `pathinfo` でパスを分解する
問題
以下のパス文字列を pathinfo で分解し、4 つの要素 (dirname / basename / filename / extension) を コロン + 半角スペース 区切りで 1 行ずつ出力してください。
$path = '/var/www/logs/access.2026-05-19.log';期待される出力:
dirname: /var/www/logs
basename: access.2026-05-19.log
filename: access.2026-05-19
extension: log
採点
php scripts/grade.php topics/14-file-io/ch05-paths/drill/01-path-info/
ヒント
$info = pathinfo($path);
echo "dirname: {$info['dirname']}\n";
echo "basename: {$info['basename']}\n";
echo "filename: {$info['filename']}\n";
echo "extension: {$info['extension']}\n";| キー | 中身 |
|---|---|
dirname |
ディレクトリ部分 (/var/www/logs) |
basename |
ファイル名 (拡張子付き) (access.2026-05-19.log) |
filename |
ファイル名 (拡張子なし) (access.2026-05-19) |
extension |
拡張子 (log — 先頭の . は付かない) |
つまづいたら
extensionが.log(先頭にドット) になる →pathinfoのextensionは.抜き で返す。自分で.を付けないことfilenameがaccess(途中まで) になる →pathinfoは 「最後の.より前」 をfilenameとする。仕様通りなのでこれが正解
ドリル 02 — `scandir` でディレクトリ一覧
問題
__DIR__ . '/tests/data/sample' 配下のファイル名を、. と .. を除いた 上で 昇順 にソートして 1 行ずつ出力してください。
tests/data/sample/ の中身 (このリポジトリにコミット済み):
apple.txt
banana.txt
cherry.txt
期待される出力:
apple.txt
banana.txt
cherry.txt
採点
php scripts/grade.php topics/14-file-io/ch05-paths/drill/02-list-dir/
ヒント
$dir = __DIR__ . '/tests/data/sample';
$files = array_values(array_diff(scandir($dir), ['.', '..']));
sort($files);
foreach ($files as $f) {
echo $f . "\n";
}scandir($dir)はディレクトリ内のエントリ名を配列で返す- 戻り値には 必ず
.(カレント)・..(親) が含まれる のでarray_diffで除く array_valuesで キーを 0 から振り直す (array_diffは元のキーを保つため、後段のsort不要な順序ズレを防ぐ)sort($files)で 明示的に昇順 (PHP / OS 環境差を消す)
つまづいたら
- 出力の先頭に
...が混ざる →array_diff(scandir($dir), ['.', '..'])でカレント・親エントリを除く - 順序がバラバラ
→
sort($files)を明示的に呼ぶ。scandirのデフォルトは昇順だが、OS / ファイルシステム差で揺れることもある - 出力が 1 行に詰まる
→
echoの末尾に"\n"を付けるのを忘れている
演習問題(2問)
サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。