Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/02/26 15:42

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ニュース

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5