微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用php将文件夹中的文件拆分为更多文件夹

我最近遇到问题,无法解决,我的服务器中有1个文件夹,其中有100,000张图像

/Images/

在此文件夹中,有100,000张这样的图像:

/Images/image1.jpg
/Images/image2.jpg
/Images/image3.jpg
...

使用cpanel文件管理器,我无法压缩这些文件,而且我无法超时打开它的Images文件夹,甚至也无法打开,即使使用filezilla和smartftp,Images文件夹也只显示10,000张图像,所以我现在最好的解决方案是将文件夹拆分为更多文件夹并将它们压缩为一部分.

我希望它可以做这样的事情:

/Images/part1/image1.jpg
/Images/part1/image2.jpg
/Images/part1/image3.jpg
...

/Images/part2/image10001.jpg
/Images/part2/image10002.jpg
/Images/part2/image10003.jpg
...

...

所以最后我将在每个文件夹中有10个文件夹,我有10,000张图片.

我可以使用PHP做到这一点吗?

谢谢.

解决方法:

这应该为您工作:

1.我使用glob()获取目录中与模式匹配的所有文件

2.我在所有文件的数组之外创建了10个带有array_chunk()的块.所以我转换了数组例如数组([0] => … [2000] => …)变为看起来像这样的数组:Array([0] => Array([0] => … [9] => …))

3.我用mkdir()创建了尽可能多的文件

4.最后,我将所有文件移至目录rename()中.

<?PHP

    //Configuration
    $folderPattern = "part";
    $chunkSize = 10;
    $path = "images/";

    //get images
    $files = glob($path . "*.*");
    $chunks = array_chunk($files, $chunkSize);

    //create folders
    for($i = 1; $i <= count($chunks); $i++) {
        if(!file_exists($path . $folderPattern . $i))
            mkdir($path . $folderPattern . $i, 0700);
    }

    //move images
    for($i = 1; $i <= count($chunks); $i++) {
        for($x = 0; $x < count($chunks[$i-1]); $x++) {
            rename($path . basename($chunks[$i-1][$x]), $path . $folderPattern . $i . "/" . basename($chunks[$i-1][$x])); 
            echo $path . basename($chunks[$i-1][$x]) . " -> " . $path . $folderPattern . $i . "/" . basename($chunks[$i-1][$x]) . "<br />";
        }
    }

?>

根据您对基本PHP的了解,您可能需要研究以下内容

> for loop
> concatenation
> if statements
> control structures

测试答案:

>含1万张图片
>与答案中的配置相同
>图像尺寸:31’503字节
>执行时间:15-17秒(平均:16.189925909042秒)

编辑:

要从以下位置更改文件夹结构:

X folders with 10 images

至:

10 folders with X images

此脚本将X文件夹转换为X / 10文件夹,例如8139-> 813个文件夹.因此,如果您要转换8139-> 813运行2x,如果需要8139-> 81运行3倍.

注意:如果文件已经存在,例如/images/part1/xy.jpg,并且您要将文件移动到此文件夹中,它将自动名称后附加-TEMP- [随机数],以免丢失.例如,如果您现在想将文件:/images/partXY/xy.jpg从文件上方移至文件夹,则将其重命名为:/images/part1/xy.jpg-TEMP-906222766.因此,您可以轻松发现这些文件并将其重命名为所需的文件.

(如果您需要对此代码的完整说明,请在评论中告诉我)

<?PHP

    //Since it can take a few seconds more than 30 and default is (mostly) 30
    set_time_limit(120);


    //Configuration
    $path = "images/";
    $chunkSize = 10;

    //Get all dirs
    $dirs = glob($path . "*");

    //Get all files
    foreach($dirs as $dir)
        $files[] = glob($dir . "/*.*");

    //Define MAX folders
    $files = array_chunk($files, $chunkSize);


    foreach($files as $key => $innerArray) {
        $baseFolder = dirname(str_replace($path, "", array_column($innerArray, 0)[0]));

        for($i = 1; $i < count($innerArray); $i++) {
            foreach($files[$key][$i] as $file) {
                if(file_exists($path . $baseFolder . "/" . basename($file)))
                    rename($file, $path . $baseFolder . "/" . basename($file) . " - TEMP-" . mt_rand());
                else
                    rename($file, $path . $baseFolder . "/" . basename($file));

                echo $file . " -> " . $path . $baseFolder . "/" . basename($file) . "<br />";
            }

            //Delete dir
            rmdir($path . str_replace($path, "", dirname($files[$key][$i][0])));
            echo "<br /><br />Removed: " . $path . str_replace($path, "", dirname($files[$key][$i][0])) . "<br /><br />";
        }

    }

?>

答测试:

>含1万张图片| à1’000个文件夹,例如每个文件夹10倍的图像
>与答案中的配置相同
>图像尺寸:31’503字节
>脚本调用:2次:

> 1’000文件夹 – &GT 100
> 100个文件夹-> 10

>执行的时间:29-33秒(平均:31.29639005661秒)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐