我正在使用 PHP 批量重命名一些本地照片。该脚本与照片位于同一目录中。
照片被命名为872376237_Photo_1_001.jpg
. 每个文件的第一组数字(在第一个下划线之前)是不同的,这就是我要删除的。
新文件名的格式应该是Photo_1_001.jpg
. 在 PHP 中,我使用$newfilename = substr($filename, strpos($filename, '_') + 1);
. 回显$newfilename
显示正确的新文件名。
问题是当我调用rename($filename, $newfilename)
文件被重命名为1_001.jpg
. 该$newfilename
变量肯定包含正确的新文件名。如果我使用copy()
而不是rename()
它按预期工作。我想不通。
这是代码:
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
$filename = $fileinfo->getFilename();
if ($filename != basename(__FILE__)) { // skip this script
$newfilename = substr($filename, strpos($filename, '_') + 1);
rename($filename, $newfilename);
}
}
}
编辑:DevZer0 在评论中解释了为什么会发生这种情况。我以为 DirectoryIterator 在迭代之前编译了所有文件的列表,但事实并非如此。只要创建(或重命名)新文件,它将不断迭代。
可能有更好的方法来做到这一点,但这有效:
$dir = new DirectoryIterator(dirname(__FILE__));
$filenames = [];
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
$filename = $fileinfo->getFilename();
if ($filename != basename(__FILE__)) {
$newfilename = substr($filename, strpos($filename, '_') + 1);
array_push($filenames, [$filename, $newfilename]);
}
}
}
foreach ($filenames as $file) {
rename($file[0], $file[1]);
}