【问题标题】:How to get last modified text files by date from remote FTP location如何从远程 FTP 位置按日期获取最后修改的文本文件
【发布时间】:2015-03-19 14:41:49
【问题描述】:

我被困在一个过程的原子化上,以便在日期明智或今天下载最后修改的文本文件。这是我的代码。

$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
$contents = ftp_nlist($conn_id, '-rt .');
reset($contents);

function is_txt($file) {
    return preg_match('/.*\.txt/', $file) > 0;
}

$filtered = array_filter($contents, is_txt);

// download all files in downloaded directory
while (list($key, $value) = each($filtered )) {

    if (ftp_get($conn_id, $dir.'\\downloaded\\'.$value, $value, FTP_BINARY))   {
        echo "Successfully written to $value\n";
    } else {
        echo "There was a problem\n";
    }
}

我成功获取文本文件,但没有选择最后修改的文件,filemtime 对我没有帮助,也没有 curl。

【问题讨论】:

    标签: php ftp


    【解决方案1】:

    从 PHP 7.2 开始,您可以使用 ftp_mlsd function 来检索文件列表,包括它们的时间戳。检查"modify" 条目。然后,您可以轻松识别最新文件。


    对于旧版本的 PHP,您将需要使用 ftp_mdtm function 来检索文件的修改时间。

    但是你必须为每个文件单独调用它,这是非常低效的。

    您也可以在ftp_rawlist 命令的用户cmets 中尝试MLSD 的实现:
    https://www.php.net/manual/en/function.ftp-rawlist.php#101071

    在采用这种方法之前,首先检查您的 FTP 服务器是否支持 MLSD,因为并非所有 FTP 服务器都支持(尤其是 IIS and vsftpd don't)。


    唯一的其他方法是使用ftp_rawlist function。但是它为每个没有预定义格式的文件返回一个ls-like 行。如果你连接到一个特定的服务器,你可以使用它;并根据服务器的具体情况对解析进行硬编码。但不可靠,如果你需要连接到任意服务器。

    *nix 服务器上的典型列表如下:

    drwxr-x---   3 vincent  vincent      4096 Jul 12 12:16 public_ftp
    drwxr-x---  15 vincent  vincent      4096 Nov  3 21:31 public_html
    -rwxrwxrwx   1 vincent  vincent        11 Jul 12 12:16 file.txt
    

    对于一些基本代码,请参阅PHP FTP recursive directory listing - 不包括时间戳解析。

    【讨论】:

      【解决方案2】:

      感谢@Martin 在您的帮助下,我能够解决上述问题

      $conn_id = ftp_connect($ftp_server);
      $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
      $contents = ftp_nlist($conn_id, '-rt .');
      reset($contents);
      
      function is_txt($file) {
       return preg_match('/.*\.txt/', $file) > 0;
      }
      
      $filtered = array_filter($contents, is_txt);
      $array = array();
      //download all files in downloaded directory
      while (list($key, $value) = each($filtered )) {
          $buff = ftp_mdtm($conn_id, $value);
      
          if ($buff != -1) {
              array_push($array,date("F d Y", $buff)); 
          } 
      
      
      }
      $lmdate = array_pop($array);
      
      $key="";
      $value="";
      reset($filtered);
      while (list($key, $value) = each($filtered )) 
       {
      
          $buff1 = ftp_mdtm($conn_id, $value);
          $cdate=date("F d Y", $buff1);
      
          if (($buff1 != -1) and ($cdate == $lmdate)){
      
              if (ftp_get($conn_id, $dir.'\\downloaded\\'.$value, $value, FTP_BINARY)) {
      
                  echo "Successfully written to $value\n";
                  } else {
                  echo "There was a problem\n";
              }
          } 
      
      }
      

      【讨论】:

        猜你喜欢
        • 2011-03-21
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        • 2012-12-06
        相关资源
        最近更新 更多