アシアル株式会社主催 開発者向け、一歩先をいくためのテクニカルセミナー

<< CSV文字化け 質問一覧 MySQLのテーブル表示 >>

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

デイレクトリにある画像をまとめて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]");
}

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

Qデイレクトリにある画像をリネーム polpol  [06月22日 03時59分] 
┣Re:デイレクトリにある画像をリネーム shimix  [06月22日 06時09分] 
┗Re:デイレクトリにある画像をリネーム polpol  [06月24日 05時17分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

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

とりあえず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は固定値で検証)。

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

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);
}

というように強引にすると消えずに連番で生成してくれました。
とりあえず解決ということで^^;
CSV文字化け 質問一覧 MySQLのテーブル表示