![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
下記はデレクトリーabcのjpg画像ファイル名を(数字.jpg)
読み込み順に(1.jpg)に変更するコードですが,エラーになります、
#!"C:\perl\bin\perl.exe"
opendir(DIR,"./abc/");# デレクトリopen
@DATA = grep /\.jpe?g/i, readdir(DIR); # デレクトリread
@SDATA = sort { $a cmp $b } @DATA;# ソート
for ($k=0; $k<=@SDATA; $k++) {
$new = $k.'.jpg';
rename ("$SDATA[$k]", "$new");
}
closedir(DIR);
exit;
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
> しかし、画像の枚数が1回実行すると2枚少なくなり
> 再度実行すると今度は6枚少なくなってしまいます
・rename は、変更先と同名のファイルが既に存在していた場合、そのファイルは消えてしまいます。
・cmp は、文字列的にソートしますが、$k.'.jpg' で生成されるファイル名は、ソートすると順番が変わります。
たとえば、0.jpg~12.jpg の13ファイルある場合、
これをソートすると、
0.jpg
1.jpg
10.jpg
11.jpg
12.jpg
2.jpg
…
9.jpg
という順番になります。
これを、0.jpg~12.jpg にrenameすると、
rename("0.jpg", "0.jpg"); #なにも起きない
rename("1.jpg", "1.jpg"); #なにも起きない
rename("10.jpg", "2.jpg"); #これで、2.jpg が消える
rename("11.jpg", "3.jpg"); #これで、3.jpg が消える
rename("12.jpg", "4.jpg"); #これで、4.jpg が消える
rename("2.jpg", "5.jpg"); #これで、5.jpg が消える
以下略
といったことになります。
ファイルが消えるのを防ぐためには、
・作業用のディレクトリを作成し、対象ファイルを一旦そちらに移動する
などの操作が必要があります。
---ここから---
$tempdir = "tempdir".$$;
$num=0;
while (-d $tempdir) {
$tempdir = "tempdir".($num++);
}
mkdir($tempdir);
foreach(@SDATA) {
rename("./abc/$_", "$tempdir/$_");
}
for ($k=0; $k<@SDATA; $k++) {
$new = $k.'.jpg';
rename ("$tempdir/$SDATA[$k]", "./abc/$new");
print "rename '$SDATA[$k]', '$new'\n";
}
rmdir($tempdir);
---ここまで---
といった感じで。
何度も回答ありがとうございます、
参考書にも書いていないことを分かりやすく
回答していただき感謝いたします、
ファイルが消滅する理由がよくわかりました。
No.3
- 回答日時:
> エラーの明細です。
CGIで実行しているんですね。
だったら、CGIとして正しい出力をしておかないとダメです。
冒頭(#!の次の行あたり)に
> print "Content-Type: text/plain\n\n";
とでも追加してみてください。
ついでに、rename の次に
> print "rename '$SDATA[$k]', '$new'\n";
とでも入れておけば、どのファイルを処理しようとしているのか表示されて状況が分かりやすくなるかと思います。
この回答への補足
再度の回答ありがとうございます
下記のコ-ドで実行するとエラーは出なくなりました、
しかし、画像の枚数が1回実行すると2枚少なくなり
再度実行すると今度は6枚少なくなってしまいます、
よろしくお願いします。
#!"C:\perl\bin\perl.exe"
print "Content-Type: text/plain\n\n";
opendir(DIR,"./abc/");#デレクトリopen
@DATA = grep /\.jpe?g/i, readdir(DIR); #デレクトリread
@SDATA = sort { $a cmp $b } @DATA; #ソート
for ($k=0; $k<@SDATA; $k++) {
$new = $k.'.jpg';
rename ("./abc/$SDATA[$k]", "./abc/$new");
print "rename '$SDATA[$k]', '$new'\n";
}
closedir(DIR);
exit;
No.2
- 回答日時:
具体的にどういうエラーが出ているのかわかりませんが、
> for ($k=0; $k<=@SDATA; $k++) {
これだとループの終了条件が1回多いです。$k < @SDATA にしないと。
(配列の要素数@SDATAに対し、添字は0~(@SDATA-1)。
> rename ("$SDATA[$k]", "$new");
readdir が返すのはファイル名だけで、ディレクトリ名は含みません。ですから、
> rename ("./abc/$SDATA[$k]", "$new");
と、ディレクトリも指定する必要があります。
(上記コードだと、変更後のファイルはカレントディレクトリに移動します。ディレクトリを移動させたくないなら、変更後のファイル名も "./abc/$new" にしてください。)
この回答への補足
回答ありがとうございます、エラーの明細です。
Server error!
The server encountered an internal error and was unable to complete your request.
Error message:
Premature end of script headers: henkou.cgi
If you think this is a server error, please contact the webmaster.
Error 500
miwaku99.ddo.jp
06/16/09 17:46:41
Apache/2.2.6 (Win32) DAV/2 mod_ssl/2.2.6 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.4
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- その他(ソフトウェア) 画像のファイル形式、拡張子が変わると、性能が変わると思うのですが、ファイル名の「jpg、png、do 8 2022/08/10 13:37
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Excel(エクセル) Excel 毎日手作業で時間がかかって、泣きたいです、、、VBAのプロの方、助けてください。。。 3 2022/10/25 04:26
- PHP 画像ファイルの名前をそのままURLにする 3 2022/10/16 11:18
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
batファイルでrenameができませ...
-
Windowsで複数のファイルを同じ...
-
readdir()で得られるファイル・...
-
Perlで フォルダ内の全て...
-
一定時間が経過したフォルダの削除
-
makefileでファイルをコピー(...
-
LinuxのC言語で、ファイル名の...
-
vba dir の相対パス
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ファイル名を複数個配列で確保...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
AutoNts
-
ファイルを分割する。
-
LISPによる横型探索
-
perlでcsvファイルを読む(ダブ...
-
cgiで表示するhtmlページ内でバ...
-
全角と半角文字が混在している...
-
エクセルVBA コードが同じでも...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでrenameができませ...
-
C言語でファイル名を取得
-
FindFirstFileとFindNextFileで...
-
パスから最後のディレクトリだ...
-
vba dir の相対パス
-
readdir()で得られるファイル・...
-
Windowsで複数のファイルを同じ...
-
エラー 'dir.h' : No such fi...
-
ディレクトリ名を取得したい
-
dos変数の%~dp0は powershellで...
-
一定時間が経過したフォルダの削除
-
find関数が1階層(カレントディ...
-
複数ファイルの読み込みについて
-
ディレクトリ内CSVデータをすべ...
-
テキストファイルの結合
-
perlのNet::FTPで、ファイルか...
-
ファイル名の変更
-
chdirがうまくできない
-
下のディレクトリ(3つ)に含ま...
-
コマンド「dir」の結果を、テキ...
おすすめ情報