0

我正在使用 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]);
}
4

0 回答 0