PHPではファイルを削除するためのunlink関数が用意されています。
この記事では、
・fopen関数で作成したファイルをunlink関数を使用して削除する方法
・ファイルの削除に失敗した場合の対処法
という基本的な内容から、
・ディレクトリ内のファイルを削除する方法
・ファイルの行を削除する方法
・特定の日付のファイルを削除する方法
などの応用的な使い方に関しても解説していきます。
今回はそんなファイルを削除する方法について、わかりやすく解説します!
作成したファイルを削除する
まずはファイルを作成してみよう
まずはファイルの削除をするために、削除用のファイルを作成してみましょう。
ファイルを作成するためには、fopen関数を使用します。
fopen関数は、ファイルオープンに成功した場合はファイルポインタを返し、失敗した場合はFALSEを返します。
PHPではファイルの読み書きなどの処理は、ファイルポインタに対して行います。
以下にファイルを作成するサンプルを紹介します。
<?php // ファイル作成 $fp = fopen("fopen.txt", "w"); // ファイル書き込み fwrite($fp, "fopen sample"); // ファイルクローズ fclose($fp); ?>
fopen.txt
fopen sample
このサンプルでは、fopen関数でfopen.txtを作成し、書き込みモードでオープンしています。
次にfwrite関数で文字列を書き込み、fclose関数でクローズしています。
ファイルの読み書きについては以下の記事でも詳しく解説していますので参考にしてください。
ファイルを削除する(unlink)
次に、作成したファイルを削除します。
ファイルを削除するには、unlink関数を使用します。
bool unlink ( string $ファイル名 [, resource $コンテキスト ] )
第一引数にはファイル名を指定します。ディレクトリ/ファイル名のようにフルパスで指定することもできます。
第二引数にはコンテキストを指定します。
unlink関数は、ファイルの削除に成功した場合はTRUE、失敗した場合はFALSEを返します。
先ほど作成したfopen.txtを、unlink関数を使用して削除してみます。
<?php $file = 'fopen.txt'; //ファイルを削除する if (unlink($file)){ echo $file.'の削除に成功しました。'; }else{ echo $file.'の削除に失敗しました。'; }?>
fopen.txt
fopen.txtの削除に成功しました。
ファイルのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
ファイルが削除できない場合
PHPではunlink関数を使用してファイルを削除できることがわかりましたが、まれにファイルの削除に失敗する場合があります。
ファイルの削除に失敗してしまう要因としては、対象のファイルを削除する権限が無いことがまず挙げられます。
MacやLinux系のOSだったらターミナルコマンドの「chown」でファイルの所有者を変更したり、「chmod」でファイルの実行権を変更するなどの方法があります。
また、PHPのchmod関数でもファイルの実行権を変更することが可能です。
bool chmod ( string $ファイル名 , int $モード )
chmod関数は第一引数にファイル名を指定し、第二引数にファイルの権限を付与するモードを指定します。
<?php $file = '/Users/Shared/PHP/php1.txt'; // 所有者に読み込み・書き込みの権限を付与して、その他は何も許可しない chmod($file, 0600); // 所有者に読み込み・書き込みの権限を付与して、その他は読み込みだけ許可 chmod($file, 0644); // 所有者に全ての権限を与えて、その他は読み込み・書き込みを許可 chmod($file, 0755); // 所有者に全ての権限を与えて、所有者が属するグループに読み込み・実行を許可 chmod($file, 0750); ?>
また、もう1つファイルの削除に失敗してしまう要因として、ファイルを開いたままの状態で削除を実行してしまう例があります。
ファイル開いたままunlink関数で削除しようとしても失敗します。
<?php $file = '/Users/Shared/PHP/php1.txt'; //ファイルを削除する if (unlink($file)){ echo $file.'の削除に成功しました。'; }else{ echo $file.'の削除に失敗しました。'; } ?>
/Users/Shared/PHP/php1.txtの削除に失敗しました。
ディレクトリ内のファイルを削除する
PHPでは、ディレクトリ内の複数のファイルを纏めて削除することが可能です。
ファイルを纏めて削除するには、パターンにマッチしたパス名を取得するglob関数を使用します。
glob関数は以下のように記述します。
array glob ( string $パターン [, int $flags = 0 ] )
第一引数には検索対象のファイルのパターンを指定し、第二引数にはGLOB_MARK、GLOB_NOSORTなどのフラグを指定します。(フラグの詳細についてはここでは割愛します)
以下にglob関数とunlink関数を使用して、ディレクトリのファイルを全て削除する方法を記述します。
<?php $dir = glob('/Users/Shared/PHP/*'); foreach ($dir as $file){ //ファイルを削除する if (unlink($file)){ echo $file.'の削除に成功しました。<br>'; }else{ echo $file.'の削除に失敗しました。<br>'; } } ?>
/Users/Shared/PHP/php1.txtの削除に成功しました。 /Users/Shared/PHP/php2.txtの削除に成功しました。 /Users/Shared/PHP/php3.txtの削除に成功しました。
サンプルではglob関数で、引数に対象のディレクトリを指定し、ディレクトリに存在している全てのファイルを取得しています。
glob関数で‘*’を指定すると、対象のディレクトリの全てのファイルを取得できます。
glob関数は戻り値にファイル名の配列を返しますので、取得した配列に対してforeachのループで配列の要素(ファイル名)に対してunlink関数で1つずつ削除しています。
このようにglob関数とunlink関数を使用すれば、ディレクトリに存在するファイルを全て削除することができます。
しかし、場合によっては消してはいけない重要なファイルまで誤って削除してしまう可能性もあります。
そのため、ファイルを全て削除するときは十分注意しましょう。
ファイルの行を削除する
ファイルの指定した行のみを削除したい場合はfile関数を使用して、ファイル全体を配列で格納した後に、unset関数で指定した要素(行)を削除する方法があります。
file関数は以下のように記述します。
array file ( $ファイル名 [, int $フラグ = 0 [, resource $コンテキスト ]] )
第一引数にファイル名を指定し、第二引数にフラグ、第三引数にはコンテキストを指定します。
今回はファイルの行を削除するのみで使用するため、引数の詳細は割愛します。
また、unset関数については、以下の記事で詳しく解説しています!
実際にファイルの指定した行のみを削除する方法を見ていきましょう。
サンプルで使用するファイルは以下のように記述しています。
apple orange melon banana pineapple
<?php $file = '/Users/Shared/PHP/php1.txt'; //ファイルの内容を配列に格納する $fruits = file($file); //指定した要素を削除する unset($fruits[3]); //ファイルの書き込み file_put_contents($file, $fruits); ?>
実行結果 apple oranege melon pineapple
実行結果のとおり、要素番号3(配列は0から始まるため4行目)の行の値が削除されていることがわかりますね。
ファイルの書き込みはfile_put_contents関数を使用すると、fopen関数を使用する手間が省けるので便利です。
日付を指定してファイルを削除する
特定の日付のファイルを削除するためには、日付関数で日付を指定する必要があります。
以下に日付が一週間以上前のファイルだったら、ファイルを削除するサンプルを紹介します。
<?php //一週間前の日付を取得 $day = date('Y-m-d',strtotime('- 7 day')); $dir = glob('/Users/Shared/PHP/*'); foreach ($dir as $file){ //ファイルのUNIXタイムスタンプを取得 $unixtime = filemtime($file); //Y-m-dに変換 $datetime = date('Y-m-d', $unixtime); //一週間より前の日付ファイルだったら削除 if($day > $datetime){ //ファイルを削除する if (unlink($file)){ echo $file.'の削除に成功しました。<br>'; }else{ echo $file.'の削除に失敗しました。<br>'; } } } ?>
このサンプルではdate関数で引数にstrtotime関数を使用して一週間前の日付を取得します。
strtotime関数で‘- 7 day’とすれば一週間前の日付が取得できます。
次に前述したglob関数で指定したディレクトリのファイルを全て取得して、戻り値の配列をforeachのループで1つずつファイルを取得しています。
ループの中でglob関数で取得したファイルの時刻をfilemtime関数を使用してUNIXタイムスタンプを取得しています。
UNIXタイムスタンプを日付フォーマットするには、date関数の引数で日付パターンと取得したUNIXタイムスタンプを指定する必要があります。
ここで紹介したstrtotime関数の使い方については、以下の記事でも詳しく解説していますので、ぜひ参考にしてください!
PHPについてもっと知りたい方へ
ここでは、PHPでファイルを削除するさまざまな方法を解説しました。
「PHPについて実はいまいちわかっていない・・・」
「もっとPHPについて詳しく知りたい!」
と思っている方は以下の記事も参考にしてみてください!
まとめ
ここではファイルを削除する方法について、
- ファイルを作成してunlink関数で削除する基本的な方法
- ファイル削除が失敗した場合の対処方法
- ディレクトリに存在するファイルをまとめて削除する方法
- ファイルを1行削除する方法
- 日付を指定して削除する方法
などについて解説しました。
ファイルを削除する処理はPHPに限らず、さまざまなプログラミング言語で使用しますのでぜひ覚えておきましょう。
もしファイルを削除する方法を忘れてしまったら、この記事を思い出してくださいね。