PHP:如何使用DirectoryIterator处理_alphabetically_文件?

时间:2014-12-07 14:01:11

标签: php file directory alphabetical file-processing

完成DirectoryIterator周期后

Using this way, 您将获得一个文件名列表,稍后您将能够按字母顺序对其进行排序,
这样你就可以用这个列表中的文件名处理每个文件 - 按字母顺序排列......

现在,如果在完成DirectoryIterator循环后,如果 你需要一个数组(按文件名按字母顺序排序),其中包含不仅是文件名
以及所有其他文件属性,例如:

  • 权限
  • 所有者
  • 创作时间
  • 大小
  • 等...

这里的问题是,在完成DirectoryIterator循环之前,您无法排序, 并且之后您将无法访问列表中的文件名以外的任何内容...

1 个答案:

答案 0 :(得分:0)

DirectoryIterator对象提供了一种访问许多文件属性的简单方法。

$dir = new DirectoryIterator($path);
foreach ($dir as $fileInfo) {
    if ((!$fileInfo->isDot())&&($fileInfo->GetExtension() == "txt")) {
        /* You can access the file information inside this cycle */
        $octal_perms = substr(sprintf('%o', $fileInfo->getPerms()), -4);
        echo $fileInfo->getFilename() . " " . $octal_perms . "\n";
    }
}

如果在完成DirectoryIterator循环后我们需要 fileInfo 对象,
我们必须将所有这些DirectoryIterator对象克隆(复制)到一个新数组中 然后按照DirectoryIterator对象的filename属性按字母顺序对此数组进行排序。

function cmp($a, $b)
{
    return strcmp($a->getFilename(), $b->getFilename());
}

$dir = new DirectoryIterator($path);
foreach ($dir as $fileInfo) {
    if ((!$fileInfo->isDot())&&($fileInfo->GetExtension() == "txt")) {
        /* we need to clone a fileInfo object into array, not just assign it */
        $allFilesInfo[] = clone $fileInfo;
    }
}

/* Alphabetically sorting the array with DirectoryIterator objects, by filename */
usort($allFilesInfo, 'cmp');

foreach ($allFilesInfo as $fileInfo) {
    /* Everything is alphabetical here ;) */
    $octal_perms = substr(sprintf('%o', $fileInfo->getPerms()), -4);
    echo $fileInfo->getFilename() . " " . $octal_perms . "\n";
}

^^在最后一个循环中,您可以按字母顺序处理文件,
虽然能够访问他们所有的财产:)

注意:如果发生崩溃,由"过多的打开文件导致"错误,
增加操作系统中每个进程的打开文件描述符的最大限制 相关配置文件取决于您的操作系统,通常它们存储在/ etc