【问题标题】:php listing a directory files by first the newestphp首先列出最新的目录文件
【发布时间】:2011-11-28 02:02:17
【问题描述】:

这是我正在尝试创建基于文件的 CMS 博客的内容。

为了显示我需要的帖子,我需要在一个文件夹中获取 10 个最新文件。

我找到了scandir,但我不需要读取所有文件,然后对它们进行排序,因为处理所需的时间取决于文件的数量。

所以我找到了opendir,这样我可以逐个文件地浏览文件夹,但是,正如 opendir 的文档所说,它使用 linux 中基于时间戳的文件系统的顺序,但首先是最新的文件修改。

所以我要问的是有没有办法改变 linux 如何对文件夹中的文件进行排序。 或者有没有办法做我想做的事?

【问题讨论】:

  • 文档在哪里说 opendir 按日期顺序输出?我很确定它的顺序是任意的(可能是 inode 升序)。
  • @therefromhere here第一条评论
  • 我相信你必须阅读所有文件(使用 scandir),因为你本质上是在排序一个无序列表,充其量是 O(n*log(n))... 而 linux 没有似乎允许您更改文件的顺序。出于好奇,为什么您的帖子文件而不是 MySql 条目?
  • @Tomas 根据经验,我很确定这是错误的(或者至少取决于文件系统)。不过,一开始你可能会把它们整理好……
  • @therefromhere,你可能是对的,我在文件管理和 php 方面没有太多经验;只是想我会分享我的 0.02 美元。

标签: php linux file list filesystems


【解决方案1】:

看一下:http://php.net/manual/en/function.filemtime.php,在用户 cmets 中,它有一个获取最新文件的示例,例如,您可以修改它以根据其 mtime 返回 10 个最新文件。

【讨论】:

    【解决方案2】:

    如果您有一个包含大量文件的文件夹,并且担心 scandir 的性能,
    您可以考虑设置一个 cronjob 来进行后台 scandir + 排序,
    确保将结果存储到另一个存储中,例如 memcache /database / disk-file

    假设您的 cronjob 每 5 分钟运行一次,
    您的 cronjob 脚本应该覆盖存储上的结果
    仅在成功时(scandir + 排序结束后)

    所以,您的 CMS 脚本只是从存储中读取,
    或者如果未找到存储结果,
    然后继续scandir +排序

    通常第一个用户点击页面并且缓存没有准备好,他会得到一个很慢的响应,
    这就是使用 cronjob 的原因是做预缓存

    【讨论】:

      【解决方案3】:

      我想我可以帮助你,但我的代码将列出所有文件,而不是仅列出最后 20 个文件,易于添加,并且代码将列出最新到最旧:

      <?PHP
      
      $directory="photos";
      $sortOrder="newestFirst";
      
         $results = array();
         $handler = opendir($directory);
      
      while ($file = readdir($handler)) { 
             if ($file != '.' && $file != '..' && $file != "robots.txt" && $file != ".htaccess"){
                 $currentModified = filectime($directory."/".$file);
                 $file_names[] = $file;
                 $file_dates[] = $currentModified;
             }   
         }
             closedir($handler);
      
         //Sort the date array by preferred order
         if ($sortOrder == "newestFirst"){
             arsort($file_dates);
         }else{
             asort($file_dates);
         }
      
         //Match file_names array to file_dates array
         $file_names_Array = array_keys($file_dates);
         foreach ($file_names_Array as $idx => $name) $name=$file_names[$name];
         $file_dates = array_merge($file_dates);
      
         $i = 0;
      
         //Loop through dates array and then echo the list
         foreach ($file_dates as $$file_dates){
             $date = $file_dates;
             $j = $file_names_Array[$i];
             $file = $file_names[$j];
             $i++;
      
             echo  "<img src=photos/$file>\n";       
         }
      
      ?> 
      

      希望对你有所帮助。

      干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多