我坚持在日期或今天下载最后修改过的文本文件的过程的雾化。这是我的代码。
$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
对我没有帮助,也没有卷曲。
答案 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";
}
}
}