我正在使用PHP批量重命名一些本地照片。该脚本与照片位于同一目录中。
照片的名称与872376237_Photo_1_001.jpg
相同。第一组数字(在第一个下划线之前)对于每个文件都是不同的,这就是我要删除的内容。
新文件名的格式应为Photo_1_001.jpg
。在PHP中,我使用$newfilename = substr($filename, strpos($filename, '_') + 1);
获取新文件名。 Echo'ing out $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]);
}