SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZineニュース

[PHPプロ!] PHPのSPLを使用してディレクトリを操作する

  • X ポスト
  • このエントリーをはてなブックマークに追加

  • X ポスト
  • このエントリーをはてなブックマークに追加

WebCheatSheet.ComでPHPのディレクトリ関数の紹介がされています。ファイル関数と同様に、C言語の関数と似たような関数群が実装されており、チュートリアル形式でディレクトリ関数の作成、削除、読み込み方法についてのソースが示されています。また、PHP 5から実装されたSPL(Standard PHP Library)のイテレータを使用した方法についても紹介されています。

 WebCheatSheet.ComでPHPのディレクトリ関数の紹介がされています。ファイル関数と同様に、C言語の関数と似たような関数群が実装されており、チュートリアル形式でディレクトリ関数の作成、削除、読み込み方法についてのソースが示されています。また、PHP 5から実装されたSPL(Standard PHP Library)のイテレータを使用した方法についても紹介されています。

 まず、PHPのディレクトリ関数で作成する方法です。

読み込み

 以下のような方法が紹介されています。

<?php
// カレントディレクトリの読み込み
$dhandle = opendir('.');
// ファイルを格納する配列
$files = array();
 
if ($dhandle) {
 // すべてのファイルを読み込む
 while (false !== ($fname = readdir($dhandle))) {
  // 「.」と「..」の場合は処理を行わない
   if (($fname != '.') && ($fname != '..') &&
    ($fname != basename($_SERVER['PHP_SELF']))) {
    // 配列への格納
    $files[] = (is_dir( "./$fname" )) ? "(Dir) {$fname}" : $fname;
   }
 }
 // ディレクトリを閉じる
 closedir($dhandle);
}
print_r($files);
?>

 PHP 5以降であればscandir関数を使用して、以下のように取得することも可能です。

<?php
// カレントディレクトリのファイルとディレクトリをすべて読み込む
$files = array();
if (is_dir('.')) {
 $files = scandir('.');
}
print_r($files);
?>

 ただし、「.」や「..」のようなディレクトリも含まれ、ディレクトリとファイルの区別はつきません。

 SPLを使用した方法は以下のようになります。

<?php
$files = array();
foreach (new DirectoryIterator('.') as $file) {
 // ファイルがドットから始まっていない場合
 if ( (!$file->isDot()) ) {
  // ファイルを格納する
  $files[] = ($file->isDir()) ?
   "(Dir) ".$file->getFilename() : $file->getFilename();
 }
}
print_r($files);
?>

 DirectoryIteratorを使用することで直接インスタンスをforeachに渡すことが可能です。

 また、ディレクトリ関数ではありませんが、glob関数を使用して以下のように取得することも可能です

<?php
// カレントディレクトリのファイルとディレクトリを
// 「.」ではじまるもの以外すべて読み込む
print_r(glob("*"));
 
// カレントディレクトリのディレクトリを
// 「.」ではじまるもの以外すべて読み込む
print_r($files = glob("*", GLOB_ONLYDIR));
?>

削除

 ディレクトリが空の場合は以下のようにします

<?php
rmdir("dir_name");
?>

 もし空ではないディレクトリを削除しようとする場合は、中にディレクトリが含まれている場合は再起処理を行います。以下はディレクトリ関数を使用する方法です。

<?php
function deleteDir($dir) {
 // ディレクトリを開く
 $dhandle = opendir($dir);
 
 if ($dhandle) {
  while (false !== ($fname = readdir($dhandle))) {
   // ディレクトリの場合は再起処理
   if (is_dir( "{$dir}/{$fname}" )) {
    // 「.」と「..」の場合は処理をしない
    if (($fname != '.') && ($fname != '..')) {
     deleteDir("$dir/$fname");
    }
   // ファイルの場合は削除する
   } else {
    unlink("{$dir}/{$fname}");
   }
  }
 closedir($dhandle);
 }
 // 空のディレクトリとなったので削除可能となる
 rmdir($dir);
}
deleteDir("temporary");
?>

 SPLを使用した削除方法は以下のようになります。

<?php
function deleteDir($dir) {
 $iterator = new RecursiveDirectoryIterator($dir);
 foreach (
  new RecursiveIteratorIterator(
   $iterator,
   RecursiveIteratorIterator::CHILD_FIRST) as $file) 
 {
  if ($file->isDir()) {
   rmdir($file->getPathname());
  } else {
   unlink($file->getPathname());
  }
 }
 rmdir($dir);
}
deleteDir("temporary");
?>

 ここで使用しているRecursiveIteratorIterator::CHILD_FIRSTはPHP 5.1から追加されているので注意してください。RecursiveDirectoryIteratorを使用すれば再起処理をSPLに任せられるので、ディレクトリ関数を使用するよりも簡単に実装できます。

作成

 ディレクトリの作成は以下のように非常に単純です。

<?php
mkdir("/path/to/directory", 0777);
?>

 第2引数は作成するディレクトリの権限を指定します。また、第3引数も指定でき、mkdirコマンドの-pオプションにあたる、再帰的なディレクトリ作成も実行可能です。

<?php
mkdir("/path/to/directory", 0777, true);
?>

関連リンク

転載元

 PHPプロ!:最新のPHPニュース

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
この記事の著者

PHPプロ!(PHPプロ!)

PHPプロ!」は、アシアル株式会社が運営するPHP開発者のためのポータル&コミュニティサイトです。同サイトでは、PHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座、PHP中級者のためのTIPSメーリングリスト、中・上級者向けの技術ノウハウ満載のPHPプロ!マガジンの提供など、PHP開発...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1051 2007/02/26 15:42

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング