プログラミング

[PHP] 指定したフォルダ(パス)からファイルを削除する方法

PHP ってファイルの削除もできるんですね

こんにちは!

6月に入り、2021年も半分が過ぎようとしているなんて早いですね…!

さて今回のブログですが、

ファイル関連ってサーバーに置いとくと、無限に増えてっちゃってお掃除しなきゃー、みたいになることありますよね。

そういう時に PHP を使ってサクッとファイルを削除しましょう、というお話です。

ということで今回は、

[PHP] 指定したフォルダ(パス)からファイルを削除する方法

についてまとめたいと思います。

前回ブログはこちらから↓

ファイルを削除するメソッド – unlink() –

ファイルを1つだけ削除する場合

至ってシンプルでコレだけです↓

unlink('削除するファイルのパス');

unlink() は成功すれば true を、失敗すれば false を返します。括弧内に指定するパスは絶対パスでも相対パスでもOKです

指定したフォルダ(パス)から複数のファイルを削除する場合

foreach を使えば、削除したいファイルが複数ある際にも対応できます。

この際、ファイルの検索に glob() やワイルドカードを利用するとなんとも便利。

$deleteFile = 'hoge.jpg'; // 削除対象のファイル名またはその一部の文字列
$filePath = glob("../sample/*");  // 削除対象のファイルが保存されているフォルダから全てのファイルパスを取得
foreach($filePath as $value){
  if(strpos($value, $deleteFile) !== false){
   // パスに削除対象の文字列が含まれていたら、ファイル削除を実行する
     unlink($value);
	}
}

glob は括弧内に指定したパターンにマッチするパス名を返します

「 * 」はワイルドカードに使用される特殊記号で、任意の長さの任意の文字列を表します

上記の場合であれば、../sample/ 配下の全てのファイルを取得します。ファイルが存在すれば配列で返してくれ、見つからない場合は false を返します。

拡張子を指定したい場合は、例えば下記のように書けばOKです。

glob(“../sample/*.jpg”);
glob(“../sample/*.png”);
glob(“../sample/*.txt”);

そしてその取得したパスを foreach で回して、strpos を使って削除対象の文字列が含まれていれば unlink() を実行する、とすれば削除対象のファイルが削除されます。

ファイルが全て正常に削除されたかチェックする方法

削除対象のファイルが複数存在する場合に、全て正常に削除されたかチェックするにはどうすればいいんだろう…

と考えて書いてみたのがコチラ↓

function deleteFiles(){
  $deleteFile = 'hoge.jpg';  // 削除対象のファイル名またはその一部の文字列
  $filePath = glob("../sample/*");  // 削除対象のファイルが保存されているフォルダから全てのファイルパスを取得
  $result = []; // unlink の実行結果を格納する配列
  foreach($filePath as $value){
      if(strpos($value, $deleteFile) !== false){
          $returnValue = unlink($value);
          array_push($result, $returnValue);  // ファイルを削除した際の返り値(true or false)を 配列 $result に追加
      }
  }
  // 削除対象のファイルが全て正常に削除できたかどうかの確認
  if(!in_array(false, $result, true)){
      return true;  // 正常に削除された場合
  }else{
      return false;  // 正常に削除されなかった場合
  }
}

一連の処理を関数化しました。

ファイル削除の処理は上記と同様ですが、unlink() は返り値として実行結果を true または false で返すので、その結果を配列 $result に格納します。

関数 deleteFiles() は、配列 $result の要素の中身が全て true = 対象ファイルが全て正常に削除されれば true を返し、反対に配列 $result の要素の中身に1つでも false が含まれていればファイル削除に何かしらのエラーがあったとみなし、false を返します。

in_array は配列に値があるかチェックするメソッドですが、必ず第3引数を指定しましょう…とネットに書いてありました^^;

in_array は第3引数に true を指定することで、厳密に型までチェックします

PHP もゆるゆる言語だもんね……

よくあるエラー

だいたいよく出くわすのがコレ↓

unlink(); No such file or directory

そんなディレクトリ、ファイルありませんよーって怒られますが、だいたいパスの指定ミスです。。

前述の通り、unlink() を使用する際のパス指定は絶対パスでも相対パスでもOKですが、

(絶対パスってデプロイ環境が変わると動かなくなったりするので、相対パスで指定しといた方が何かと便利かなーと思います)

もし unlink() を使った処理が関数化されている場合は、その関数が実際に実行される場所からの相対パスを指定しないと動かないので注意です(実体験)。

まとめ

今回は、PHP で指定したフォルダ内からファイルを削除する方法について書いてみました。

パスの指定をミスると、消すはずじゃなかったファイルを消しちゃったー(真っ青)なんてこともあるかもしれないので、パスの指定とデータの取り扱いには十分注意が必要そうですが、

PHP でこんなこともできるんやなーという新たな発見でした。

けどバックエンドってなんとなく無骨?な感じで表に見えないし、難しいよね……

ここまでお読みいただき、ありがとうございました!