重命名功能无法按预期工作

时间:2013-08-05 07:13:11

标签: php

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

0 个答案:

没有答案