ディレクトリ・ファイルの操作
戻る


[2]ディレクトリ・ファイルの操作

【ディレクトリ・ファイルの操作関数】

ディレクトリ・ファイルの操作には「 ファイルシステム関数 」または「 ディレクトリ関数 」を 使います。

まず、カレントディレクトリを読むプログラムを作成してみましょう。
このプログラムはソースをコピーしたりせずに、ご自分でタイプしてみてください。
<?php
///////////////////////////////////////////
//PHPプログラムの動作テスト
//ディレクトリの内容を読んでみる
///////////////////////////////////////////

//このスクリプトを設置するカレントを指定
$url="./";

//初期化項目
$filecount=0;
$dircount=0;
$erorr="";

//ディレクトリのオープン
if ($dir = @opendir($url)) {
    //繰り返しディレクトリ内のファイルを読む
    while($file = readdir($dir)) {
        //ディレクトリを数える
        if (is_dir($file)){
            //ディレクトリの更新日時を所得
            $localday = date("Y年m月d日 H時i分s秒",filemtime ($file));
            //ディレクトリをカウント
            $dircount++;
            //ディレクトリ名に更新日時をつけて配列に格納
            $dirname[$dircount]="$localday,$file";
        }
        //ファイルを数える
        else{
            //ファイルの更新日時を所得
            $localday = date("Y年m月d日 H時i分s秒",filemtime ($file));
            //ファイルをカウント
            $filecount++;
            //更新日とファイルネームをつける
            $filename[$filecount]="$localday,$file";
        }
    }
closedir($dir);
}
else{
    $erorr="ディレクトリのオープンに失敗しました!!";
}
//これで$urlで指定したディレクトリが開かれ、ディレクトリは配列$dirname[$dircount]に
//ファイルは配列$filename[$filecount]に格納されました。
//ディレクトリが開かれなかった場合は$erorrにエラーメッセージが格納されます。

//$erorrが空だった場合(ディレクトリが読み込めた場合)
if($erorr==""){
    //ディレクトリ配列に値があった場合
    if(isset($dirname)){
        foreach($dirname as $key => $value){
            list($dirdays,$dirnames)=explode(",",$value);
            print "■".$key.":".$dirnames.":".$dirdays."<br>";
        }
    }
    else{
        print "ディレクトリはありません<br>";
    }
    //ファイル配列に値があった場合
    if(isset($filename)){
        foreach($filename as $key => $value){
            list($fildays,$filnames)=explode(",",$value);
            print "□".$key.":".$filnames.":".$fildays."<br>";
        }
    }
    else{
        print "ファイルはありません<br>";
    }
}
//$erorrが空ではなかった場合(ディレクトリが読み込めなかった場合)
else{
    print $erorr;
}
?>
さて、全てタイプし終わったら、「readdir.php」などという名前をつけて、FTP でアップロードしてみてください。ディレクトリの内容は読み込めたでしょうか?
うまく動かない場合はタイプミスを確認してください。 エラーメッセージが表示されている場合はエラーの行が表示されます。

【表示の解説】
「.」はこのディレクトリを表すものです。
「..」は一つ上のディレクトリを表すものです。
■はディレクトリを表し、□はファイルを表しています。ソースをよくみてください。
ここで使用しているPHP関数は以下の関数です

・opendir()
ディレクトリ関数で、指定したディレクトリを開きます。先頭の@は「エラー制御演算子」です。

・readdir()
ディレクトリ関数で、開かれたディレクトリの中を読み、配列に格納します。

・is_dir()
ファイルシステム関数で、指定されたものがディレクトリかどうか調べます。ディレクトリ の場合はTRUEを返し、他の場合はFALSEを返します。

・date()
日付・時刻関数で、日付・時刻をファーマットするのに使用します。

・filemtime ()
ファイルシステム関数で、ファイルの更新時刻を取得します。時間はUNIXタイムスタンプとして返します ので、先のdate()関数でフォーマットしなおさないと日時として使用できません。

・closedir()
opendir()で開いたディレクトリをクローズします。 ※開いたディレクトリは必ずクローズします。

・isset()
変数用の関数で、指定した変数に値があるかどうか調べます。値がある場合はTRUEを、ない場合は FALSEを返します。

・list()
配列用の関数で、配列をexplode()関数などで分解して別の変数に分けて代入します。

・explode()
文字列関数で、指定した条件で配列または文字列を分解します。

より詳細な説明はPHPマニュアルのそれぞれの項目を見てくださいね。

ちなみに「.」と「..」を表示させない場合はソースに以下の条件分岐を追加します。
<?php
///////////////////////////////////////////
//PHPプログラムの動作テスト
//ディレクトリの内容を読んでみる
///////////////////////////////////////////

//このスクリプトを設置するカレントを指定
$url="./";

//初期化項目
$filecount=0;
$dircount=0;
$erorr="";

//ディレクトリのオープン
if ($dir = @opendir($url)) {
    //繰り返しディレクトリ内のファイルを読む
    while($file = readdir($dir)) {
        if($file!="."&&$file!=".."){
            //ディレクトリを数える
            if (is_dir($file)){
                //ディレクトリの更新日時を所得
                $localday = date("Y年m月d日 H時i分s秒",filemtime ($file));
                //ディレクトリをカウント
                $dircount++;
                //ディレクトリ名に更新日時をつけて配列に格納
                $dirname[$dircount]="$localday,$file";
            }
            //ファイルを数える
            else{
                //ファイルの更新日時を所得
                $localday = date("Y年m月d日 H時i分s秒",filemtime ($file));
                //ファイルをカウント
                $filecount++;
                //更新日とファイルネームをつける
                $filename[$filecount]="$localday,$file";
            }
        }
    }
closedir($dir);
}
else{
    $erorr="ディレクトリのオープンに失敗しました!!";
}
//これで$urlで指定したディレクトリが開かれ、ディレクトリは配列$dirname[$dircount]に
//ファイルは配列$filename[$filecount]に格納されました。
//ディレクトリが開かれなかった場合は$erorrにエラーメッセージが格納されます。

//$erorrが空だった場合(ディレクトリが読み込めた場合)
if($erorr==""){
    //ディレクトリ配列に値があった場合
    if(isset($dirname)){
        foreach($dirname as $key => $value){
            list($dirdays,$dirnames)=explode(",",$value);
            print "■".$key.":".$dirnames.":".$dirdays."<br>";
        }
    }
    else{
        print "ディレクトリはありません<br>";
    }
    //ファイル配列に値があった場合
    if(isset($filename)){
        foreach($filename as $key => $value){
            list($fildays,$filnames)=explode(",",$value);
            print "□".$key.":".$filnames.":".$fildays."<br>";
        }
    }
    else{
        print "ファイルはありません<br>";
    }
}
//$erorrが空ではなかった場合(ディレクトリが読み込めなかった場合)
else{
    print $erorr;
}
?>
青字が追加した条件分岐です。「.」と「..」は読まないという条件をつけています。



TOPへ