在PHP中递归迭代目录

时间:2015-06-04 10:13:26

标签: php

当我将照片上传到我的网络服务器时,我会尝试将照片分成几个文件夹,这样我就不会在一个文件夹中包含这么多照片。

例如在一个类中:

$filename = hash('crc32b', mt_rand());
$img_dir = UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1].DS.$filename[2].$filename[3].DS.$filename[4].$filename[5];

DSDIRECTORY_SEPARATOR

的简短版本

这可以创建如下目录:

public_html\assets\upload\img\25\55\8b
public_html\assets\upload\img\00\8c\2a

如果文件不存在且没有类似的目录

$img_path = $img_dir.DS.$filename.'.jpg';

if (!file_exists($img_path) && !is_dir($img_dir)) {
    $mode = 0755;
    mkdir($img_dir, $mode, true);

    chmod(UPLOAD_DIR, $mode);
    chmod(UPLOAD_DIR.DS.'img', $mode);
    chmod(UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1], $mode);
    chmod(UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1].DS.$filename[2].$filename[3], $mode);
    chmod(UPLOAD_DIR.DS.'img'.DS.$filename[0].$filename[1].DS.$filename[2].$filename[3].DS.$filename[4].$filename[5], $mode);
}

我不是所有的文件夹都是755,怎么能递归呢?

编辑:

另外,当我493echo $mode;时,为什么我会将echo 0755;作为输出?

2 个答案:

答案 0 :(得分:0)

如果你有权访问shell,并假设操作系统是Linux,我会选择:

system('chmod -R ' . escapeshellarg(UPLOAD_DIR));

至于你的编辑,0755是八进制,十进制为493

编辑:您也可以尝试此功能,请注意$path应该是单个文件的完整路径,或者指向目录的路径

function chmod_recursive($path, $mode) {
    if(is_dir($path)) {
        foreach(glob("$path/*") as $file) {
            chmod_recursive($file, $mode);
        }
    }
    else if(is_file($path)) {
        chmod($path, $mode);
    }
}

这样称呼它:

chmod_recursive(UPLOAD_DIR, 0755);

答案 1 :(得分:0)

迭代从根开始的目录:

foreach (new DirectoryIterator(UPLOAD_DIR) as $fileInfo) {
    if($fileInfo->isDot()) continue;
    chmod($fileInfo->getFilename(), $mode);
}

取自here