• ベストアンサー

ディレクトリ内の最新ファイルのみをコピーが上手くいかない

下記のようなスクリプトにより、 ./ディレクトリ内の更新日付が最新のファイル名を取得し、 そのファイルを./bbbディレクトリにコピーするということを行いたいのですが、 更新日付が最新のものに関わらず全てのファイルがコピーされてしまいます。 <?PHP $dir = opendir("./"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $to="./bbb/".$fnm; if(!file_exists($to)) copy("./".$fnm,$to); } } closedir($dir); ?> 自力ではどこがヘンなのか理解できないため、どなたか教えてください。

  • PHP
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
回答No.3

すみません、あまりにもいい加減過ぎました(笑。 最後は //if(!file_exists($to)) copy("./".$fnm,$to); if(!file_exists($to)) copy("./".$latestfilename,$to); にならなければいけませんね。

wf3255
質問者

お礼

御礼が遅くなってしまい申し訳ございません。 まさにかゆい所にダイレクトなご回答をいただき、 誠に感謝いたします。 どうもありがとうございました。

その他の回答 (2)

回答No.2

あれ?まだ解決してませんでしたか? <?PHP $dir = opendir("./"); $latestfile = 0; while ($fnm = readdir($dir)) {  if($fnm == "." || $fnm == "..") continue;  $ftime = filemtime("$fnm");  if($latestfile < $ftime){   $latestfile = $ftime;   $latestfilename =$fnm;   $to="./bbb/".$fnm; //  if(!file_exists($to)) copy("./".$fnm,$to);  } } closedir($dir); if(!file_exists($to)) copy("./".$fnm,$to); ?> テストしてないので自身ありませんが、コピーするタイミングを単にループの中からループが終わってからにしただけです。

  • sonetea
  • ベストアンサー率26% (9/34)
回答No.1

> if($latestfile < $ftime){ > $latestfile = $ftime; > $latestfilename =$fnm; > $to="./bbb/".$fnm; > if(!file_exists($to)) copy("./".$fnm,$to); > } $latestfileが更新されるたびにファイルをコピーしていますね。 ファイルのコピーは最新のファイルを見つけ終わった後でするべきなので、 ifの中ではファイル名を別な変数に保存するようにしたら道でしょう?

wf3255
質問者

お礼

御礼が遅くなってしまい申し訳ございません。 ご回答を参考にして解決できました。 感謝いたします。

関連するQ&A

  • 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
  • 条件によりそれ以下を実行しない方法

    あるディレクトリ(./ppp)をオープンして、ディレクトリ内の最新ファイル名を取得し、その最新ファイル名(下記スクリプト中の$filename)に".gz"という文字列が含まれていたらそれ以下のスクリプトを実行せずにディレクトリクローズしてスクリプトを中止するスクリプトを考えています。下記スクリプト中の■■■の部分にあたる部分がわかりませんのでご教授願います。phpは4.3.2です。 =========== <?php $dir = opendir("./ppp");//ディレクトリオープン $latestfile = 0;//最新ファイル名取得 while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./ppp/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./ppp/$latestfilename"; } } ■■■ ・ ・ ・ closedir($dir); ?> ===========

    • ベストアンサー
    • PHP
  • fopenで変数で指定したファイルの開き方

    同階層にあるディレクトリの中の更新日付が最新のファイルを整形してHTML形式にて出力するスクリプトを書いています。 下記に例を書きます。 注)aaa→同階層にあるディレクトリです。   PHP→Ver4.3.8 <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { $ftime = filemtime($fnm); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; $handle = @fopen("$latestfilename", "r"); if ($handle) { while (!feof($handle)) {    ・    ・    ↓   sring処理へと続く   echo(nl2br($String処理後の変数名));      } } fclose($handle); } } closedir($dir); ?> この方法だと上手くいきません。 エラー内容は『fclose(): supplied argument is not a valid stream resource』です。 ファイルが開かれていません。 よってfopenで変数で指定されたファイルを開く方法をご教授願います。 もし『fopen使うこと自体が誤っている』ということでしたら正しい書き方をご教授願います。

    • ベストアンサー
    • PHP
  • if文の使い方

    自分では解決できない為、質問させていただきます。 Webサイトの任意の場所に下のスクリプトを埋め込み、 ./testディレクトリに7日以内に更新ファイルがあり、かつファイル名にrrrという文字列がなければWEBサイトの埋め込んだ場所にABCDEFGHIJKと表示させることを考えています。 よって7日以内に更新があってもファイル名にrrrが含まれる場合や、 7日以内に更新がない場合はwebサイトにABCDEFGHIJKと表示させたくありません。 自分で書いてみた下記スクリプトではいつでもABCDEFGHIJKと表示されてしまいます。 ※下記9行目の$latestfilenameをechoするとちゃんと最終更新ファイル名を表示してくれます。(ここまでは上手くいっています) <? $dir = opendir("./test"); $latestfile=0; while (($fnm = readdir($dir)) !== false) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./test/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; } } if($fnm == "." || $fnm == "..") continue; if(preg_match("/rrr/",$latestfilename)){ printf(""); break; } else if($nowdate - $fftime < 604800) { printf("ABCDEFGHIJK"); } else if($nowdate - $fftime > 604800) { printf(""); } closedir($dir); ?> 何がおかしいのかご教授ください。

    • ベストアンサー
    • PHP
  • fwrite~サーバ環境で、なぜか0バイト

    ちょっと悩んでしまい質問させていただきます。 下記スクリプトにて、 (1)./aaaディレクトリ内の最新更新日付ファイルをオープン (2)文頭18バイトを削除し、残りのデータを同じファイルに保存する。 というスクリプトを作成しました。 っがしかし、ローカル環境(XAMPP)では上手く動いたのですがサーバー上ではなぜか当該ファイルが0バイトになってしまします。解決策がわかりませんのでご教授願います。 ただ、一点気がかりなのがサーバーは仕様でPHP4.3.2であるので、マニュアルのftruncateにある“注意”の内容が気にかかっています。戻り値が異なることが関係有るかも含めてご教授いただけると助かります。 ======== <?php $dir = opendir("./aaa"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./aaa/$latestfilename"; } } $fp = fopen($filename, "rwb+"); fread($fp, 18); //18バイト読み飛ばす ftruncate($fp, 0);//上記18バイトを削除 $warn = ''; while (!feof($fp)) { $warn .= fread($fp, 8192); } rewind($fp); fwrite($fp, $warn); fclose($fp); closedir($dir); ?> ========

    • ベストアンサー
    • PHP
  • renameでのPermission deniedエラー

    下記スクリプトを実行すると、『Warning: rename(./aaa/bbb.send,./aaa/bbb.send.gz) [function.rename]: Permission denied in ...line 31←renameの行数』というエラーになります。 =========== <?php $dir = opendir("./aaa"); $latestfile=0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./aaa/$latestfilename"; $fp = fopen($filename, "rwb+"); fread($fp, 18); //18バイト読み飛ばす ftruncate($fp, 0); $warn = ''; while (!feof($fp)) { $warn .= fread($fp, 8192); } rewind($fp); fwrite($fp, $warn); rename($filename,"$filename.gz"); fclose($fp); } } closedir($dir); ?> ============= renameの手前でchmodを実行させ、aaaディレクトリ及びファイル自身(./aaa/$filename)にパーミッション0777を与えても現象は変わりません。renameする$filenameにつきましても./aaa/$filenameとしたり、./aaa/$latestfilenameとしてみましたがやはり変わりませんでした。 解決策があればご教授願います。

    • ベストアンサー
    • PHP
  • ファイルコピー

    「ルートディレクトリ内の全てのファイルの中でファイル名に"1111"及び"2222"と言う文字列が含まれるファイルを./333/444ディレクトリに同じファイル名が無ければコピーする」 というスクリプト(下記qqq.php)を作りましたが、 「ルートディレクトリ内の全てのファイルの中でファイル名に"1111"及び"2222"と言う文字列が含まれるファイルの中で最もファイル更新時刻が新しいものだけを./333/444ディレクトリに同じファイル名が無ければコピーする」 と変えたいのですがどうも上手くいきません。 この『・・・文字列が含まれるファイルの中で最もファイル更新時刻が新しいものだけを・・・』の部分につきまして、ご教授ください。 スクリプトを記載していただけるととても助かります。 どうか宜しくお願いいたします。 ********************* qqq.php <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/1111/",$file)) { if(preg_match("/2222/",$file)) { $to="./333/444/".$file; if(!file_exists($to)) copy("./".$file,$to); } } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • shtmlファイルでのif文

    質問させていただきます。 htmlファイルへの埋め込みだとうまくいくのですが、 shtmlファイルへ下記スクリプトを埋め込むと、 『あかさたな!")); break; } else { printf(""); break; } } ?> 』 とスクリプトの部分まで表示されてしまいます。 この消し方(『あかさたな』とだけ表示させたい)をご存知の方、 お教えください。 <? $dir = opendir("./aaa/bbb/ccc"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filectime("./aaa/bbb/ccc/$fnm"); $nowdate =strtotime(date("Y-m-d")); if(strtotime($nowdate) - $ftime <= 7*24*60*60) { printf("<FONT size="2"><B>あかさたな</B></FONT>"); break; } else { printf(""); break; } } ?>

    • ベストアンサー
    • PHP
  • printfで表示させるのは一度にしたい

    QNo.2814162で質問させていただいた者です。 下記のスクリプトで./tttディレクトリに5日以内に作成されたファイルがあれば"ABCDEFGHI"と表示させようと思っております。 (5日以内に作成されたファイルが無ければ何も表示しない) しかし、./tttディレクトリにマッチしたファイルの数だけ "ABCDEFGHI"が表示されてしまいます。 もしマッチしたファイルが合った場合、 一度だけ"ABCDEFGHI"と表示させるようにするにはどうしたらよいでしょうか? <? $dir = opendir("./ttt"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filectime("./ttt/$fnm"); $nowdate =strtotime(date("Y-m-d")); if(strtotime($nowdate) - $ftime <= 5*24*60*60) { printf("ABCDEFGHI"); } else { printf(""); } } ?>

    • ベストアンサー
    • PHP
  • 特殊な条件一致

    ちょっと前に似た質問をさせていただき、 解決に至ったかに見えたのですがさらに困難な状態になってしまい、質問させていただきます。 タイトルの『特殊な条件一致』は「./testディレクトリ内のファイル名を取得し、下記の3つの条件をクリアしていればwebサイトの任意の場所にABCDと表示させる」と言うものです。 その条件は ======== 条件1.7日以内に更新があったファイルがある。 条件2.ファイル名にrrrという文字列を含んでいない。 条件3.rrrと言う文字列を含んだファイル名のファイルはrrrを含まないファイル名を持っており(元ファイル→abc.txt 現在のファイル名→rrrabc.txt)そのファイルは更新日付が新しくとも除外。 ======== になります。 例えば./test内に下記ファイル達がいるとします。 abc.txt   →2日前更新 rrrabc.txt  →2日前更新 def.txt   →8日前更新 ghi.txt   →4日前更新 この場合にwebサイトの任意の場所にはghi.txtの存在によりABCDと表示されることになります。 条件3がないとしたら、下記のスクリプトで希望どおりの表示がされます。 ======== $message = ''; $dir = opendir('./test'); $ctime =time() -604800; while ($fnm = readdir($dir)) { if($fnm != '.' && $fnm != '..' && filemtime("./test/$fnm") > $ctime) { if(preg_match('/rrr/',$fnm)==0) $message='ABCD'; } } closedir($dir); print $message; ======== 6行目のif文で条件3の為の処理が必要になると思うのですが、それがわかりません。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう