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

时间:2015-03-19 14:41:50

标签: php ftp

我坚持在日期或今天下载最后修改过的文本文件的过程的雾化。这是我的代码。

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

2 个答案:

答案 0 :(得分:1)

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


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

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

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

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


唯一的另一种方法是使用ftp_rawlist function。但它为每个没有预定义格式的文件返回ls - 类似的行。如果连接到一个特定的服务器,则可以使用它;并根据服务器的细节对代码进行硬编码。但如果您需要连接到任意服务器,它就不可靠。

答案 1 :(得分:1)

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

}