PHPでファイル操作をするときによく使うのが削除処理です。
画像やPDFをアップロードしたけどやっぱり削除したいときや、ログファイルを1週間すぎたものから削除するなど。
ファイルを削除する関数 unlink()
ファイルの削除には unlink() を使います。
$削除するファイルのパスは、相対パスでもいけます。
実際に削除してみましょう。
1 |
unlink("images/neko03.jpg"); |
上のコードは、このコードが書かれたPHPファイルと同じディレクトリ内に images というディレクトリがあり、その中にある neko03.jpg という猫の画像を削除しています。
まとめてファイル削除する方法
まとめて削除はワイルドカード使って
1 |
unlink("images/*.jpg"); |
で出来そうですが、出来ませんでした(笑)
指定したディレクトリ内のファイル全て削除する場合は、glob() を使って一覧を取得してループしながら削除します。
glob()の使い方は次の記事を参照。
≫ PHPで指定したディレクトリ内のファイル名とディレクトリ名一覧取得
1 2 3 4 5 6 |
$res = glob('images/*'); foreach ($res as $f) { if (is_file($f)) { unlink($f); } } |
is_file() でファイルかどうかを判定していますが、unlink() はディレクトリの削除には対応していないためです。
ディレクトリを指定しちゃうとエラーが吐き出されます。
拡張子を指定して一覧を取得したりすれば確実にファイルなので is_file() は不要です。
1 2 3 4 |
$res = glob('images/*.jpg'); foreach ($res as $f) { unlink($f); } |
日付を比較して削除する方法
日付を比較して削除する場合は、まず基準となる日付を取得し、ファイルの日付を取得します。
両方の日付のフォーマットを比較して条件にマッチすれば削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 7日前の日付取得 $ago = date("Y-m-d", strtotime("-7 day")); // JPGファイル一覧を取得 $res = glob('images/{*.jpg,*.jpeg,*.png}', GLOB_BRACE); foreach ($res as $file) { // ファイルのタイムスタンプを取得 $unixdate = filemtime($file); // タイムスタンプを日付のフォーマットに変更 $filedate = date("Y-m-d", $unixdate); // 日付を比較して、7日より前のファイルなら削除 if($filedate < $ago){ unlink($file); } } |
えらそうにサンプルコード載せましたが、テストしてないです!
たぶん想定通り動くと思うんですけど自己責任で使ってください。
ファイルが削除できないとき
ファイルが削除できないエラーが出たときは、80%は削除対象のファイルを開いていたりしている場合です。
fopen() とかでファイル開いたあとクローズしているかチェックしてください。
あとはパーミッションで権限が無い場合です。
それか条件が間違ってて削除処理にたどり着いてないかです。
この3つで大抵解決できると思います。
まとめ
PHPでファイルを削除するときは unlink() を使います。
ファイルの削除が対象で、ディレクトリの削除はできません。
まとめて削除にワイルドカードなんかは使えないので glob() をうまく使って対象のファイルを抽出してください。
コメントを残す