如何从远程 FTP 位置按日期获取最后修改的文本文件

How to get last modified text files by date from remote FTP location

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

$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 对我没有帮助,也没有卷曲。

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


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

但是你必须为每个文件单独调用它,效率很低。

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

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


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

*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

一些基本代码,见 – 不包括时间戳解析。

谢谢@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";
        }
    } 

}