PHP文件重命名神秘没有错误图像丢失

时间:2016-03-03 21:12:46

标签: php file upload rename move

我有一堆随机名称的照片,我想在网上发布,所以他们需要重命名为1.jpg,2.jpg,3.jpg等;

我写了以下代码来实现这个

$i = 1;
if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && is_file($path.'/'.$file)) {
            $oldname   = $path.'/'.$file;
            $path_info = pathinfo($oldname);            
            rename($oldname, $path.'/'.($i).'.'.'jpg');
            echo "Old name = <b>".$oldname."</b></br>";
            echo "New name = <b>".$path.'/'.($i).'.'.'jpg'."</b></br></br>";
            $i++;
        }
    }
    closedir($handle);
}

并且魔术发生在运行此脚本后文件夹中有22个文件只有14个图片保留了名称1.jpg,10.jpg到22.jpg当我再次刷新然后只有6个图片剩下名字1。 jpg到6.jpg现在在这一点上,即使经过一次又一次的刷新,它们也没有改变。

我试着评论rename($oldname, $path.'/'.($i).'.'.'jpg');只是为了看看生成了什么旧的名字和新名字,这些都很好,就像旧名称的新名称生成我想要的1.jpg到22.jpg < / p>

我尝试了几乎相同的代码来将.JPG扩展名更改为.jpg扩展名,因为linux服务器对文件命名区分大小写,而windows不是这段代码一直工作正常;

if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && is_file($path.'/'.$file)) {
            $oldname   = $path.'/'.$file;
            $path_info = pathinfo($oldname);
            echo $sub= substr($file,0,-4);
            echo "<br>";
            rename($oldname, $path.'/'.($sub).'.'.'jpg');
        }
    }
    closedir($handle);
}

早上2点40分在印度,我只是个学生,这个问题不让我进入睡眠模式,请帮助我。

1 个答案:

答案 0 :(得分:0)

在循环重新思考()后,我明白了为什么这段代码没有用,为什么它适用于扩展重命名。

重命名功能将2个参数作为文件的旧名称和带有位置的新名称,它也可以移动文件,如果在新位置或相同位置已存在同名文件,则只会覆盖它并且不会有任何错误。

要理解这一点,举一个例子,摄影文件夹中有22个图像,从1.jpg到22.jpg,但随机顺序如1.jpg,10.jpg,15.jpg等。

然后这个代码将采用1.jpg并将其重命名为1.jpg到目前为止这么好但是下次循环它将需要10.jpg(这是文件夹中的第二个文件)并将其重命名为2.jpg确定这是代码所期望的,但是暂停一下,已经存在一个名为2.jpg的文件,它只是被代码覆盖而没有任何错误,从而导致数据丢失。

现在你要说明为什么hack图像像1.jpg,10.jpg那样排列,如果存在2.jpg而不是为什么它们不被命名为1.jpg和2.jpg? 答案很简单,有些图片有.jpg,有些.JPG图片有.JPG优先。

要克服这个问题,你需要做大多数软件所做的事情。 WinRAR你需要一个临时文件夹来移动你的文件,然后再将文件移动到源文件夹,代码就像下面这样。

String[] cmdarray = {"rsync",
    "-avrz",
    "--timeout=100",
    "rsync://10.149.21.211:8730/logflow/click/file1 logfile/click/file2",
    // separated argument contains space but not single (or other) quote
    "/home/kerrycai/puller" };
... Runtime.getRuntime.exec(cmdarray); ...

并且感谢大家因为你而没有帮助我,因为我自己做了。