デイレクトリにある画像をリネーム - PHPプロ!Q&A掲示板

2777

  • 0P

デイレクトリにある画像をリネーム

質問日時 / 2010年6月22日 03:59    回答数 / 2件

Questioner:  polpol  このエントリーをはてなブックマークに追加 

キーワード / 画像リネーム    デイレクトリ    一覧表示   

デイレクトリにある画像をまとめて0.1.2.3と...いうようにリネームしたいのですが
画像500枚くらいなら正常に動作してくれるのですが
1000枚以上になると番号が飛び飛びになって合計枚数もなぜか537枚に減ってしまいます。
検索しても分からなかったのでよろしくお願いします。
ソースコードは以下です。


$diropen=opendir("img/");
while($file_name=readdir($diropen)) {
$files5[]=$file_name;
}
closedir($diropen);
//1つ目と2つ目の要素に.が入るので先頭から2要素を削除
array_splice($files5, 0,2);

$lognum= count(file('log/0.txt'));
////拡張子だけを取得する
for( $i = 0; $i < count($files5); $i ++ ){
list($use, $pas5[]) = explode( ".", $files5[$i] );
}
for( $i = 0; $i < count($files5); $i ++ ){
$rename= $lognum+$i;
rename("img/$files5[$i]", "img/$rename.$pas5[$i]");
}

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimixとりあえずreaddirの「正しい使い方」をマニュアルで
┗A02polpolshimixさん回答ありがとうございます。 上記のコード

回答一覧

並び替え:

A01
answerershimix [6月22日 06:09] (最終編集:6月23日 13:42)

とりあえずreaddirの「正しい使い方」をマニュアルで確認してください。

  http://jp2.php.net/manual/ja/function.readdir.php

多分「例2」を丸写し(pathだけ変更)でかまわないと思いますが・・。

で、配列に格納後にprint count($files5)などが正しい値(ファイル数)になっているかなどを確認してください(この時点で取得出来ていない気がします・・)。またrenameが成功しているかどうかもチェックしてみてください。


(以下蛇足)
「あらかじめ」拡張子を配列に入れておく必然性がわかりません。foreachで$file5からファイル名を取り出してからでも拡張子は取得可能だと思います。というか拡張子の取得で「.」で区切るだけだとファイル名に「.」が複数あったときに困りませんか?素直にpathinfoで取得すべきだと思います。

  http://jp2.php.net/manual/ja/function.pathinfo.php




  1. $path = 'img/';
  2. $lognum= count(file('log/0.txt'));
  3. $file = array();
  4.  
  5. if ($handle = opendir($path)) {
  6.     while (false !== ($file_name = readdir($handle))) {
  7.         if ($file_name != "." && $file_name != "..") {
  8.             $file[] = $file_name;
  9.         }
  10.     }
  11.     closedir($handle);
  12. }
  13.  
  14. print 'source count = ' . count($file) . '<br />';
  15.  
  16. foreach ($file as $value) {
  17.     $source = $path . $value;
  18.     $fpath = pathinfo($source);
  19.     if (rename($source, $path . $lognum++ . $fpath['extension'])) { continue; }
  20.     print 'cannot rename ' . $source . '<br />';
  21. }

#まったくの未検証ですのであしからず。typoなどがあったら適宜修正してください(汗


(追記)
とりあえず上記スクリプトで2000件,4000件で試しましたが問題なく出来てます($lognumは固定値で検証)。

この意見に回答する

ツリーへ TOPへ

A02
answererpolpol [6月24日 05:17]

shimixさん回答ありがとうございます。
上記のコードでも更新するごとに画像数が減るんですが
rename関数でFlseになった所があるから減る?と思い
上記のコード参考に書き換えてみました↓


$path = 'img/';
$lognum= count(file('log/0.txt'));
$file = array();

if ($handle = opendir($path)) {
 while (false !== ($file_name = readdir($handle))) {
       if ($file_name != "." && $file_name != "..") {
           $file[] = $file_name;
       }
    }
    closedir($handle);
 }
 
 print 'source count = ' . count($file) . '<br />';


 foreach ($file as $value) { 
    $source = $path . $value;
    $fpath = pathinfo($source);

///いったん1.2.3.4...という名前にリネームする
rename($source, $path.$lognum++);

}

if ($handle = opendir($path)) {
 while (false !== ($file_name = readdir($handle))) {
       if ($file_name != "." && $file_name != "..") {
           $filee[] = $file_name;
       }
    }
    closedir($handle);
 }
$lognum2= count(file('log/0.txt'));
for( $i = 0; $i < count($filee); $i ++ ){
$rename2= $lognum2+$i;

rename("img/$filee[$i]", "img/$rename2.jpg");
///ログファイル作成。追加書き込みモード
$fp = fopen("log/0.txt", "a+");
$www = $rename2.'<>'.$rename2.'.jpg<>'.$category.'<>'.$_POST['title'].'<>'.$_POST['naiyou'].'<>'.$today.'<>'.$ip.'<>'.$host."\r\n";
fwrite($fp, $www);
fclose($fp);
}

というように強引にすると消えずに連番で生成してくれました。
とりあえず解決ということで^^;

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)