ファイル操作をする前に、このページをチェック!というものが欲しかったので、書いてみました。
PHP関数を使ったファイル操作における注意事項
readdirについては、ファイルを再帰的に処理する場合に.
と..
を除外する必要がないか確認する必要があります。例えば、ディレクトリを丸ごと削除するような場合に、より深い階層を削除しているつもりが..
を使って親ディレクトリへ制御が移ってゆき、場合によってはPHPファイルが自滅する場合もあります。。。
※追記:コメント頂いたようなクラス(SPL)を使った方法ではこの点をより安全に処理できるようです。
関数名 | 用途 | 注意点 |
---|---|---|
readdir | エントリの取得 |
opendir()後に使用。ファイル名の他に. (カレントディレクトリ), .. (親ディレクトリ)も返す |
scandir | エントリ一覧の取得 | ディレクトリを指定して使用。ファイル名の他に. (カレントディレクトリ), .. (親ディレクトリ)も返す |
rmdir | ディレクトリ削除 | 削除対象のディレクトリが空である必要がある |
glob | パスの検索 | パターンにマッチするパス名を検索 |
他にも扱うファイルの名前が日本語の場合、上手く行かないことがあり、注意が必要との助言を頂きました。
使いやすいファイル操作関連関数
関数名 | 用途 |
---|---|
is_dir | パスがディレクトリであるかどうか調べる |
is_file | パスがファイルかどうか調べる |
file_exists | パスに ファイルかディレクトリ が存在するか調べる |
unlink | ファイル削除 |
copy | ファイルコピー |
rename | ファイルの移動 |
basename | ファイルパスを渡した場合、ファイル名を返す |
dirname | ファイルパスを渡した場合、ディレクトリのパスを返す |
chmod | アクセス権限の変更(Unixシステム向け?) |
コメント頂いているように、 クラスを使った方法 も良いみたいです! |
PHPマニュアルの気をつけたい用語
用語 | 意味 |
---|---|
エントリ | ファイルやディレクトリーなどを総称してentry(エントリ)と言うらしい |
$filename | PHPマニュアルで$filenameと書かれている場合、ディレクトリも対象だったりする |
file | ファイルとディレクトリを総称してfileと呼ぶ事がある |
PHPで使われる言葉はUNIXに関連しているというのがヒントだと思います。
関数の使用例(サンプルコード)
別記事にすべきかもしれませんが、量がないのでひとまずここに記載しておきます。
<?php
/**
* ディレクトリの中身が空か判定
*
* @param string $dir_path ディレクトリまでのパス
* @return bool ディレクトリが空の場合、true
*/
function isEmptyDir($dir_path) {
return (count(glob($dir_path . "/*")) == 0);
}
クラスを使ってファイルの一覧を取得する (2015/05/19追記)
特定ディレクトリ以下のファイルのパス一覧を表示する
$iteratorIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("path/to/directory"));
foreach ($iteratorIterator as $pathName => $file) {
var_dump($file);
echo "{$pathName}\n\n";
}
特定ディレクトリ以下のjpgファイルのパス一覧を表示する
$iteratorIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("path/to/directory"));
$objects = new RegexIterator($iteratorIterator, '/^.+\.jpg$/i', RecursiveRegexIterator::ALL_MATCHES);
foreach ($objects as $pathName => $cur) {
var_dump($cur);
echo "{$pathName}\n\n";
}
この記事は今後も更新していこうと思います。