PHPで2時間前に作成されたファイルを削除する方法

このQ&Aのポイント
  • PHPでfiles/tmpディレクトリ内の2時間前に作成されたファイルを削除する方法について質問です。
  • filemtime関数を使用してファイルの作成時間を取得し、現在時間との差分を計算して条件分岐していますが、正しい値が返されずすべてのファイルが削除されてしまいます。
  • 原因がわかる方がいらっしゃいましたら、ご回答をお願いします。
回答を見る
  • ベストアンサー

PHPで2時間前に作成されたファイルを削除する方法

files/tmpというディレクトリーの中のファイルの作成日が2時間を過ぎたら削除するようにしたいのですが、 <?php function EmptyDir($dir) { $handle=opendir($dir); $currenttime = mktime(); while (($file = readdir($handle))!==false) { $diff = ($currenttime - filemtime($file)); echo '<br/>'; echo 'diff: '.$diff; if($diff != null && $diff >= 7200){ @unlink($dir.'/'.$file); } } closedir($handle); } EmptyDir('files/tmp'); ?> filemtimeの問題だそうです。使い方を間違えているのかな?作成したてのファイルのパス名を引数として渡してecho filemtime("files/" . $_FILES["upfile"]["name"]);のようにすれば正しい値を返すそうですが、以上に書いたEmptyDir関数の中にfilemtime($file)を呼び出せば違う値が返されています。そしてその$diff(現在時間からファイルの作成時間を引いたもの)が微妙にいつも予想された値よりずっと大きいので、作成したてのファイルを含めてディレクトリーの中身が全部消されてしまいます。 どなたか原因のわかる方がいらっしゃいましたら、ご回答を宜しくお願いします。

  • 2B2B
  • お礼率100% (60/60)
  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

readdirは、opendirで指定したディレクトリ内の「ファイル名」だけが返ってきます。 ディレクトリ情報が入っていませんので、そのファイルにアクセスするためには、ディレクトリ名を付加する必要があります。ですので、 > $diff = ($currenttime - filemtime($file)); これは、unlink部と同様、 > $diff = ($currenttime - filemtime($dir.'/'.$file)); のようにする必要があります。

2B2B
質問者

お礼

なるほど!!ありがとうございます。こんなミスするなんてね... 今後もっと注意します。

関連するQ&A

  • unlinkでどうしてもファイルが削除できない!!

    お世話になります。 いろいろとネットで情報を探しているのですが、どうしても解決しません。 ローカルなapacheのサーバにファイルをアップロードし、指定のファイルを削除するプログラムを作成しています。 プログラムファイルのあるディレクトリの下に"files"というディレクトリがあり、その下に、アップロードした日付でディレクトリ(例:"200511171010")をプログラム側で作成し、その下にファイルをアップロードするものです。 編集するプログラムで、選択したファイルを削除するというものです。 サーバは、Windows2000,MySQL,Apacheです。プログラムはEUCで書かれています。 ・フォルダを作成するプログラム $uniq = $dir_y.$dir_m.$dir_d.$dir_h.$dir_i; $uploaddir = "./files/$uniq/"; //ファイルのアップロード処理 if($_FILES['file1']['name'] != ""){ mkdir("$uploaddir"); $ufile[1] = $_FILES['file1']['name']; $ufile[1] = str_replace("'","’","$ufile[1]"); $uploadfile = $uploaddir.$ufile[1]; move_uploaded_file($_FILES['file1']['tmp_name'],mb_convert_encoding($uploadfile, "SJIS", "EUC-JP")); } ・ファイルを削除する部分 $rslt = unlink("./files/$uniq/$t[$i]"); です。 エラーは、 Warning: unlink(./files/20051115195407/購入書籍.xls) [function.unlink]: No such file or directory in C:\Program Files\Apache Group\Apache2\htdocs\shuchi\edit_ok.php on line 103 です。ファイル自体はあるのですが、削除されていません。 パーミッションとかも、フォルダを作成するときとか、いろいろいじってみたのですが解決しませんでした。 何かわかれば是非、教えてください。すみませんがよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpでファイルが削除できない

    こんにちは。 ファイル名の書かれたdir.txtを開いて、その中から1日以上経過したファイルを削除するtime.phpを作成しようと思っています。 実行してみると、24時間経過したファイルがあっても 「Warning: unlink() [function.unlink]: Permission denied in C:\Program Files\xampp\htdocs\test\time.php on line 33」 というエラーがでて削除できない 実行結果にprintするように指定していない$imaの数値「1128673152」が表示される。 のですが、どこに間違いがあるのでしょうか? time.phpの内容 ---------------------------------------------------------------------- <html> <body> <?php // ファイルを読み込み専用でオープンする $fp = fopen('dir.txt', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); $line = rtrim($line); // ファイルの更新時間を調べる $kousin = filemtime("$line"); // 今の時刻 $ima = time(); // 経過時間を計算する $keika = $ima - $kousin; // 出力する print $line; print "<br>\n"; print $ima; print "<br>\n"; print $kousin; print "<br>\n"; print $keika; print "<br>\n"; clearstatcache(); if ( $keika > 86400 ) { unlink( "$file" ); } } // ファイルをクローズする fclose($fp); ?> </body> </html> ----------------------------------------------------------------------

    • ベストアンサー
    • PHP
  • PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラム

    PHPでディレクトリ名のみ表示する方法が知りたいです。以下のプログラムで「test」というディレクトリ内のファイル一覧(ディレクトリ名とファイル名)を表示するようにしているのですが、この中からディレクトリ名のみ表示させたいのですがどのようにすればいいのでしょうか? よろしくお願いします。 <?php if ($dir = opendir("test/")) { while (($file = readdir($dir)) !== false) { if ($file != "." && $file != "..") { echo "$file<br>\n"; } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • filemtimeについて

    filemtime関数を使ってあるディレクトリ(./aaa)の中の最新のファイルを表示させようとしていますが、少し前までは上手くいっていたのですが、急に予定通りに動かなくなってしまい、ちょっと自分では解決できないため質問させていただきます。 スクリプトは下記になります。 <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; clearstatcache(); $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; $filename = "./aaa/$latestfilename"; echo "$filename"; } } closedir($dir); ?> これで実行すると、aaaディレクトリ内のファイル名が全て表示されてしまいます。※ファイルの更新日時はファイルごとに異なっています。 どなたかご教授願います。

    • ベストアンサー
    • PHP
  • makefile でファイルをコピーする方法

    makefileであるディレクトリ(SRC_DIR)以下のファイル(ディレクトリ)のうち「CVS」以外を、別のディレクトリ(DST_DIR)へコピーしたいのですが、どのように記述したらよいのでしょうか? 記述例(途中): SRC_DIR = ./src DST_DIR = ./dst FILES = $(shell ls $(SRC_DIR)); FILES_TO_REMOVE = CVS FILES_TO_COPY = $(filter-out $(FILES_TO_REMOVE), $(FILES)); # ↑ ここまでで、コピーすべきファイルのリストが作成できた # ↓ ここからどのように記述したらいいか? all:     

  • PHPのファイル削除についての質問です。

    PHPについての質問です。 現在、自社サイトで使用している画像の管理画面を作っているのですが、 PHPを使って不要になった画像を削除する部分を作成しております。 しかし、まだ何分初心者なのでわからないところもあり質問させていただきました。 削除用のPHPファイルを作成しておりますが、動作すると以下のエラーが出てしまいます。 Fatal error: Cannot redeclare deletedata() (previously declared in ・・・・・・・・・/php/delete.php:5) in ・・・・・・・・・・・/php/delete.php on line 5 組んだプログラムに問題があると思いますが、この場合どのようにすればよろしいでしょうか。 分かる方アドバイスをお願いします。 <?php $no = 1; foreach(glob('../images/slider/*.jpg') as $val){ function deletedata($dir) { if($dirhandle = opendir($dir)) { while(false !==($val = readdir($dirhandle))) { if($val != "." && $val != "..") { unlink($dir.$val); } } closedir($dirhandle); } } } ?>

    • 締切済み
    • PHP
  • ディレクトリ内にあるファイルの最終更新時間を取得したい

    指定したディレクトリ内に自動生成されて保存されるファイルの最終更新時間を取得したいと思っています。 hogeというディレクトリがあったとして この中に200511.logというファイルがあり日々更新されて行きます。 ただし、月が変わると200512.logと新しいファイルが生成されてまた更新されて行くような感じです。 この場合、ただ <?php echo "最終更新: " . date("Y-n-d", filemtime('hoge/200511.log')); ?> とすれば、当月は良いのですが、来月になったら更新されなくなってしまいます。 ディレクトリの時間でやってみたらどうかと思い、 <?php echo "最終更新: " . date("Y-n-d", filemtime('hoge/')); ?> とやってみましたが、これだと、ただ単にhogeというディレクトリ自体の更新が表示されてしまいました。(当たり前か。。) つまりやりたい事は、hogeディレクトリ内でなにか変化が起きたらその時間を表示したい、ということなのですが、どうすれば良いでしょうか?

    • ベストアンサー
    • PHP
  • unlink が余計に働いてエラーメッセージ

    お世話になります。 PHPを学んでいるものです。 開発環境は、Pleiades3.5のPHPを使っています。 やりたいことは、画像データのアップロード後の仮置きファルダの掃除です。 しかし、以下のコードでやると、「Warning: unlink(images/upload/.) [function.unlink]: Permission denied in C:\xampp\htdocs\root\manager_item_edit03.php on line 530」が2つ出てきます。 if( $handle = opendir(PRE_IMAGE_DIR) ){ while( ($file=readdir($handle)) == true ): if( file_exists(PRE_IMAGE_DIR.$file) ){ unlink(PRE_IMAGE_DIR.$file); } endwhile; closedir($handle); } ただ、目に見えるファイル(事前に無駄なファイルをいくつか置いてみました)はすべて削除されています。つまり、私から見ると、unlinkが余計に働いたことでエラーが出ている状況です。 念のため、unlinkの前に下記のコードを挿入して、何のファイルか見てみたところ、「.」、「..」というピリオド(!?)だけのファイル名があるようです。 ?> <pre> <?php echo $file; ?> </pre> <?php 皆様で、このエラーを回避する方法や、そもそも何のファイルなのか、ご存知であればご教示をください。お願いします。

    • ベストアンサー
    • PHP
  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP
  • ディレクトリ内の拡張子指定ファイル移動

    自分では難解で、同じような質問がなかったため質問します。私は新米です。 ルートディレクトリ(./)内の拡張子が『.send』のファイルを全て別のディレクトリ(./back)に移動するクーロンを組もうと思っているのですが、ルートディレクトリのパーミッションが750のためか下記のスクリプトですと、copyの行及びunlinkの行でPermission deniedのエラーが出ます。 ./backディレクトリに関しては777にしています。 ルートディレクトリのパーミッションはサーバーの仕様で変えられないのですが、何か有効がありますでしょうか?どうかご教授ください。 <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/.send/",$file)) { copy("./".$file,"./back".$file); unlink("./".$file); } } closedir($dir); } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう