我如何修改readdir()列出文件的方式。

时间:2011-03-16 20:47:07

标签: php

我有一个脚本,每天在目录中创建一个zip包。完成此操作后,另一个脚本会删除目录中的“last”文件,因此我总是只有最近的x天。

while (false !== ($file = readdir($handle))) 
    {
            if ($file != "." && $file != "..")
            {
                echo "$file";
                echo '<br>';

                //count files
                $file_count = $file_count + 1;
            }
        }

但突然readdir()正在返回这样的文件列表:

March_16_2011.zip

March_12_2011.zip

March_13_2011.zip

March_14_2011.zip

March_15_2011.zip

当然,而不是最旧的文件被删除,最新的文件是。

当我查看FTP中的文件时,它们的日期都是正确的。

在这种情况下,为什么readdir()会将它们恢复原状?如何强制它以我想要的方式订购它们? (按日期)

7 个答案:

答案 0 :(得分:4)

readdir以任意顺序返回文件名,具体取决于操作系统如何从文件系统返回条目。您需要手动对结果列表进行排序:

foreach (glob("*") as $fn) {
    $files[$fn] = filemtime($fn);
}
arsort($files);
$files = array_keys($files);

答案 1 :(得分:1)

AFAIK没有按日期排序的PHP函数,但您可以编写自己的函数:

$filearr = array();
while (false !== ($file = readdir($handle))) 
{
        if ($file != "." && $file != "..")
        {
             $stat = stat($file);
             $filearr["$file"] = $stat['mtime'];
        }
 }

asort($filearr);

另见: http://nl2.php.net/manual/en/function.stat.php

答案 2 :(得分:1)

foreach (glob("$dir/*.zip") as $f)  echo $f;

如果为您的文件提供合理的名称,那就是您需要的所有代码,例如2011-03-12.zip

答案 3 :(得分:0)

您无法强制readdir()订购文件。 但您可以使用stat()检查哪个是最旧的文件。

答案 4 :(得分:0)

尝试使用scandir而不是readdir为文件设置排序

有关scandir的更多信息:http://uk3.php.net/manual/en/function.scandir.php

否则,您可以将您的folderstructur读入数组,然后使用各种php排序函数对其进行排序。

答案 5 :(得分:0)

我会使用glob()。这也可以通过数字自动排序,也可能更好地获取文件......

glob("data/*.{zip,tar.gz,tar.bz2}", GLOB_BRACE);

但要按日期排序,你可能需要这样做:

$data = $FILE_NAME_VAR_HERE; // duh
$parts = explode("_"); // explode it by underscore   
unset($parts[0]); // unset the first one 
$data = implode("_", $parts); // return the string without it

未测试。

希望这可以解决您的问题:)

答案 6 :(得分:0)

Ol'忠实array_multisort()也可以起草来处理来自glob()的文件列表。

$files = glob("*.zip");
$times = array_map('filemtime', $files);
array_multisort($times, $files);