PHPでディレクトリを作成・操作する方法!初心者向けにmkdir・rmdir・scandirをやさしく解説
生徒
「PHPでフォルダを作ったり、中のファイルを調べたり、削除したりできますか?」
先生
「はい、できますよ。PHPにはmkdir・rmdir・scandirというディレクトリ(フォルダ)を扱うための関数があります。」
生徒
「ディレクトリって、パソコンの中のフォルダのことですよね?」
先生
「そのとおりです!今回はそのディレクトリをPHPで作ったり、調べたり、削除したりする方法を、プログラミング初心者にもわかりやすく説明していきます。」
1. ディレクトリとは何かを知ろう
プログラミングの世界で頻繁に登場する「ディレクトリ(directory)」。難しく聞こえるかもしれませんが、その正体は私たちが普段WindowsやMac、スマートフォンで使っている「フォルダ」と全く同じものです。
ファイルが増えてくると、「画像」「ドキュメント」「設定用」といった具合に種類ごとに整理したくなりますよね。この「ファイルを整理するための入れ物」を、ITの専門用語ではディレクトリと呼びます。
- ファイル: ノートに書いた「1ページ分のメモ」
- ディレクトリ: そのメモを綴じておく「バインダー」や「引き出し」
PHPというプログラミング言語を使うと、このディレクトリを「自動」で操作できるようになります。たとえば、以下のようなイメージです。
<?php
// PHPで「2026年_写真保存用」という名前のディレクトリ(フォルダ)を
// 作成するイメージをコードで表すとこのようになります
$folder_name = "2026年_写真保存用";
echo "「" . $folder_name . "」というディレクトリを作成し、ファイルを整理します。";
?>
手動で右クリックして「新規フォルダ作成」をする代わりに、PHPプログラムがあなたの代わりにディレクトリを作ったり、中身をチェックしたりしてくれるのです。これにより、大量のデータを扱うシステムでも、迷子にならないようにきれいに整理整頓することが可能になります。
2. mkdir関数でディレクトリを作成する方法
PHPで新しくフォルダを作りたいときは、mkdir(メイク・ディレクトリ)関数を使います。これは、パソコンのデスクトップで「右クリック > 新規作成 > フォルダ」と操作するのを、プログラムに代行させる命令です。
まずは、最もシンプルで安全な書き方を見てみましょう。プログラミング未経験の方でも、以下のコードをコピーして実行するだけでディレクトリが作成できます。
<?php
// 作成したいフォルダの名前を決める
$directory_name = "new_folder";
// すでに同じ名前のフォルダがないかチェックする
if (!is_dir($directory_name)) {
// フォルダを作成する(mkdirを実行)
if (mkdir($directory_name, 0777)) {
echo "「" . $directory_name . "」というフォルダを無事に作成しました!";
} else {
echo "エラー:フォルダの作成に失敗しました。";
}
} else {
// すでに存在する場合のメッセージ
echo "「" . $directory_name . "」は、すでに存在しています。";
}
?>
- is_dir関数: 同じ名前のフォルダがすでにある場合、
mkdirを実行するとエラーになってしまいます。事前に「ないこと」を確認するのがプロの書き方です。 - パーミッション(0777):
mkdirの2番目の設定で、フォルダの「読み書き権限」を指定できます。Webサーバーで動かす際に「書き込めない!」というトラブルを防ぐための重要な数値です。 - 再帰的作成:
mkdir("a/b/c", 0777, true)のように、3番目の設定にtrueを入れると、深い階層のフォルダも一気に作れて便利です。
この基本を押さえておけば、ユーザーが会員登録した瞬間にその人専用の画像保存フォルダを自動で作る、といった便利なシステムも簡単に実装できるようになります。
3. scandir関数でディレクトリの中身(ファイル一覧)を確認する
ディレクトリを作成した後は、その中にどんなファイルが入っているか確認したくなりますよね。そんな時に便利なのがscandir(スキャンディア)関数です。この関数を使うと、指定したフォルダ内にあるファイルやフォルダの名前を「一覧リスト(配列)」として丸ごと取得できます。
例えば、画像が保存されている「images」というフォルダの中身を画面に表示させたい場合は、以下のように記述します。プログラミング未経験の方でも、foreachという命令を使えば、リストの中身を一つずつ順番に取り出すことができますよ。
<?php
// 調べたいディレクトリの名前を指定
$dir = "images";
// ディレクトリが存在するか確認してから実行するのが安全
if (is_dir($dir)) {
// 中身をスキャンして配列(リスト)に代入
$files = scandir($dir);
echo "<h3>フォルダ内の一覧:</h3>";
echo "<ul>";
// 配列の中身を一つずつ取り出して表示
foreach ($files as $file) {
echo "<li>" . $file . "</li>";
}
echo "</ul>";
} else {
echo "指定したディレクトリが見つかりませんでした。";
}
?>
scandirを実行すると、自分で作った覚えのない「.(ドット)」と「..(ドットドット)」という名前が必ずリストに出てきます。これは故障ではなく、システム上の大切なルールです。
- . (ピリオド1つ): 「今見ているディレクトリ自身」を指します。
- .. (ピリオド2つ): 「一つ外側の(上の階層の)ディレクトリ」を指します。
実際のWebサイト制作では、if文を使ってこの2つを除外して表示させるのが一般的です。まずは「こういうものが入ってくるんだな」と覚えておけばOKです。
この関数を使えば、「アップロードされた写真を一覧表示するギャラリーページ」や「自動でファイル名を取得してリンクを作る機能」などが簡単に作れるようになります。
4. rmdir関数でディレクトリを削除する方法
作成したディレクトリが不要になったときは、rmdir(リムーブ・ディレクトリ)関数を使って削除します。これは、ゴミ箱にフォルダを捨てる操作をプログラムで実行するイメージです。
ただし、一つだけ大きな注意点があります。rmdirは「中身が空っぽのディレクトリ」しか削除できないというルールがあります。中にファイルが一つでも残っているとエラーになってしまうため、まずは空のディレクトリを安全に消す基本コードを覚えましょう。
<?php
// 削除したいディレクトリの名前を指定
$dir_to_delete = "temporary_folder";
// 1. まず、そのディレクトリが本当に存在するか確認
if (is_dir($dir_to_delete)) {
// 2. ディレクトリを削除する(rmdirを実行)
if (rmdir($dir_to_delete)) {
echo "「" . $dir_to_delete . "」を正常に削除しました。";
} else {
echo "エラー:ディレクトリが空ではないか、権限がありません。";
}
} else {
// 存在しない場合のメッセージ
echo "削除しようとした「" . $dir_to_delete . "」は見つかりませんでした。";
}
?>
- 空でないと消せない: 中に画像やテキストファイル、あるいは別のフォルダが入っている場合は、先に中身をすべて空にする必要があります。
- 権限(パーミッション):
mkdirの時と同様に、サーバーの設定によっては「削除する権限」がなくて失敗することもあります。 - 存在確認が大事: 存在しないフォルダを消そうとするとエラー(Warning)が出るため、必ず
is_dirでチェックするのがWeb開発のセオリーです。
初心者のうちは、一時的に作ったテスト用の空フォルダを整理する目的でこの関数を使ってみるのが、一番安全で確実な練習方法ですよ。
5. 実践で役立つ!よくあるつまずきポイントと解決策
PHPでディレクトリ操作をしていると、コードは合っているはずなのに動かない…という場面に遭遇することがあります。ここでは初心者が特にはまりやすい「3つの壁」とその対策を詳しく解説します。
1. パーミッション(権限)のエラー
サーバー上のフォルダには「誰が読み書きできるか」というルール(権限)があります。特に「mkdirでフォルダが作れない」「rmdirで消せない」場合は、PHPを実行しているプログラムにその場所をいじる許可がないことが原因です。
対策:FTPソフトやコマンドで、親フォルダの権限を「777」や「755」に変更して書き込みを許可しましょう。
2. 「すでに存在します」エラーを回避する
同じ名前のフォルダがある状態で mkdir を実行すると、PHPは「もうあるよ!」と警告(Warning)を出して止まってしまいます。これを防ぐには、作成前に必ず「存在チェック」を入れるのが鉄則です。
<?php
$target = "test_dir";
// もしディレクトリが存在「しない」場合だけ作る
if (!is_dir($target)) {
mkdir($target);
echo "新しく作成しました。";
} else {
echo "すでにあるので作成をスキップしました。";
}
?>
3. 中身があるディレクトリは消せない
rmdir は、中身が完全に空(から)の状態でないと使えません。中に一つでも .txt や画像ファイルが入っていると削除に失敗します。一見空に見えても、隠しファイルが存在する場合もあるので注意が必要です。
対策:中身がある場合は、まず中のファイルを一つずつ削除してから、最後にディレクトリを消すという手順を踏みます(※この具体的なやり方は次の章で詳しく解説します!)。
これらのポイントを意識するだけで、デバッグ(プログラムの修正)にかかる時間を大幅に短縮でき、より安定したシステムを構築できるようになりますよ。
6. 応用編:中身が入っているディレクトリを丸ごと削除する方法
前の章で解説した通り、rmdir関数は「空のフォルダ」しか消せません。しかし、実際の開発では「中にファイルが入っているけれど、不要になったからフォルダごと消したい」という場面がよくあります。
その場合は、いきなりフォルダを消すのではなく、以下の3ステップで処理を行います。
scandirでフォルダ内のファイル一覧を取得するunlink関数を使って、中のファイルを1つずつ削除する- 中身が空になったところで、最後に
rmdirを実行する
プログラミング未経験の方でも理解しやすいよう、安全に中身を空にしてから削除するサンプルコードを用意しました。
<?php
// 削除したいディレクトリ名
$target_dir = "temp_data";
// 1. ディレクトリが存在するか確認
if (is_dir($target_dir)) {
// 2. ディレクトリの中にあるファイル名を取得
$files = scandir($target_dir);
foreach ($files as $file) {
// 「.」と「..」はシステム用の特殊な記号なので無視する
if ($file !== "." && $file !== "..") {
// ファイルのフルパス(場所)を作成して削除
$file_path = $target_dir . "/" . $file;
// それがファイルなら削除を実行
if (is_file($file_path)) {
unlink($file_path);
}
}
}
// 3. 中身が空になったので、ディレクトリ本体を削除
if (rmdir($target_dir)) {
echo "フォルダ「" . $target_dir . "」とその中身をすべて削除しました。";
} else {
echo "エラー:フォルダの削除に失敗しました。";
}
} else {
echo "指定されたフォルダが見つかりません。";
}
?>
- unlink関数: ファイルを削除するための専用関数です。
rmdirがフォルダ用なのに対し、unlinkはファイル(画像やテキストなど)を消す時に使います。 - パスの結合:
$target_dir . "/" . $fileのように、フォルダ名とファイル名をスラッシュで繋ぐことで、プログラムが正確にファイルの場所を特定できるようにしています。
この一連の流れは「お掃除」と同じです。箱(ディレクトリ)を捨てる前に、まずは中のゴミ(ファイル)を片付ける必要がある、とイメージすると覚えやすいですよ。少し複雑に見えますが、実務のシステム開発では必須のテクニックです。
7. 実務で役立つ!PHPでディレクトリを自動操作する具体的な活用シーン
PHPでフォルダ(ディレクトリ)をプログラムから操作できるようになると、手動では不可能な「自動化」が実現します。実務の現場で mkdir・scandir・rmdir がどのように使われているのか、代表的な活用シーンを見ていきましょう。
ユーザー専用フォルダの作成
SNSや会員制サイトで、ユーザーが登録した瞬間にその人専用の画像保存用フォルダを mkdir で自動作成します。IDごとに整理することで、データの混線を防ぎます。
日付ごとのログ・バックアップ管理
「2026-02-05」といった日付の名前で毎日フォルダを作り、その日の売上データやアクセスログを保存します。is_dir でチェックしてから作れば、二重作成のエラーも防げます。
例えば、以下は「今日の日付のフォルダがなければ作成する」という、実務で非常によく使われる初心者向けのサンプルコードです。
<?php
// 今日の日付(例:2026-02-05)をフォルダ名にする
$today = date("Y-m-d");
if (!is_dir($today)) {
// フォルダがなければ作成する
mkdir($today, 0755);
echo "本日分の保存用フォルダ「" . $today . "」を新規作成しました。";
} else {
// すでにある場合は作成しない(エラー回避)
echo "「" . $today . "」フォルダは準備済みです。";
}
?>
このように、mkdir(作成)・scandir(一覧確認)・rmdir(削除) の3つを組み合わせることで、「古いファイルを自動でスキャンして削除する」といったメンテナンス作業も自動化できるようになります。ファイル管理の自動化は、効率的なWebシステム開発の第一歩です。ぜひ自分の環境でコードを動かして、その便利さを体感してみてくださいね。
まとめ
PHPでディレクトリを操作する方法は、初心者が最初につまずきやすい部分ですが、この記事で学んだように基礎となる関数をしっかり理解すれば確実に扱えるようになります。とくに、mkdirで新しいフォルダを生成する仕組み、scandirでフォルダの中身を一覧として取得する方法、そしてrmdirで安全にディレクトリを削除する流れは、ファイル管理を行ううえで欠かせない重要な操作です。これらを適切に組み合わせることで、画像管理やユーザーデータ管理といった実用的な処理にも応用できるようになります。
また、ディレクトリを扱う際には、書き込み権限の確認や「空でないディレクトリは削除できない」という基本ルールを忘れないことが大切です。実務では多くのアプリケーションで自動的にフォルダが生成されたり、不要なデータが削除されたりするため、今回の知識はPHP開発全体で役立ちます。特に、is_dirやunlinkを組み合わせて状態を判断しながら処理を進めることで、安全にディレクトリ操作を行うことができます。
以下は今回の内容をふり返る意味で、基本的なディレクトリ操作をひとまとめにしたサンプルコードです。実際の開発ではこれを応用して、ユーザーごとにフォルダを作成したり、自動的に古いファイルを整理したりする機能に発展させることができます。
サンプルプログラムまとめ
<?php
$dir = "sample_dir";
// ディレクトリがなければ作成
if (!is_dir($dir)) {
mkdir($dir);
echo "新しいフォルダを作成しました。\n";
}
// フォルダの一覧を確認
$items = scandir($dir);
foreach ($items as $item) {
echo "中身:" . $item . "\n";
}
// 中身を削除してからフォルダを削除
foreach ($items as $item) {
if ($item !== "." && $item !== "..") {
unlink($dir . "/" . $item);
}
}
rmdir($dir);
echo "フォルダと中身を安全に削除しました。";
?>
このコードでは、フォルダの作成・確認・削除までの流れをひとつの処理として確認できます。ディレクトリ操作はファイルアップロードやキャッシュ管理など幅広い用途で必要となるため、確実に身につけておくと開発の幅が大きく広がります。初心者でも、ひとつひとつの動作を確認しながら学ぶことで理解が深まり、より実践的な処理にも対応できるようになります。
生徒
「今日の内容で、フォルダを作ったり中を調べたり、全部PHPでできることがわかりました。mkdirとscandirとrmdirの役割がはっきり見えてきました!」
先生
「その理解はとても良いですね。ディレクトリ操作はアプリケーションでよく使うので、今回の知識は必ず役に立ちますよ。特に、scandirで一覧を取得してから内容を処理する流れは実務でもよく使います。」
生徒
「フォルダの中が空じゃないとrmdirが失敗する理由もよくわかりました。unlinkで中身を削除してから実行するのも勉強になりました。」
先生
「とても良いですね。実際の開発でもまず状況を確認してから処理を進めるのが大切なので、今日学んだ流れをしっかり覚えておきましょう。」
生徒
「はい!次はもっと応用的なディレクトリ操作にも挑戦してみたいです!」