我有一个脚本,每天在目录中创建一个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()
会将它们恢复原状?如何强制它以我想要的方式订购它们? (按日期)
答案 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);
答案 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);