如何从远程 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";
}
}
}
我被困在一个进程的原子化上,以下载日期明智或今天最后修改的文本文件。这是我的代码。
$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";
}
}
}