gpt4 book ai didi

PHP - 检查文件是否存在于不支持 SIZE 的 FTP 服务器上

转载 作者:可可西里 更新时间:2023-11-01 12:36:19 26 4
gpt4 key购买 nike

是的,我知道,很难相信那些 FTP 服务器仍然存在,但它们确实存在。 IBM iSeries 机器运行此类服务器。

我已经得到了一个涉及 ftp_nlistin_array 的答案,但是,正如你们中的一些人可能已经猜到的那样,这很慢目录包含大量项目。

由于缺少对 SIZE 的支持,fopen 在读取模式下使用时总是失败(记住 FTP 包装器不支持 x),而 ftp_size 总是返回 -1(这是预期的)并且 file_exists 总是返回 false(可能是因为它在内部使用了 SIZE? ).

  • ftp_getftp_fget 可以解决问题,但如果文件存在,它们会下载整个文件。不是很好。一种可能的解决方案涉及使用 ftp_fget 传递以只读模式打开的文件的处理程序,并捕获引发的警告。当文件不存在的时候就不一样了,但是这个解决方案感觉很粗鲁,我也不知道是否可行(也许有人可以举个例子)。

  • 另一种解决方案使用 ftp_nb_get/ftp_nb_fget 来尝试检索文件。如果函数返回 0 (FTP_FAILED),则文件可能不存在。我仍然需要处理一个临时本地文件,如果返回 FTP_MOREDATA(否则无法发出其他 FTP 命令),关闭并重新打开连接很糟糕。

你有什么想法吗?

最佳答案

SIZE 命令不是必需的。您可以为此简单地使用函数 ftp_nlist(),因为 FTP LIST 命令允许传递目录和文件作为参数。

尽管 PHP 文档中没有提及它在 RFC 959 中指定(第 32 页)并且正在工作。这是一个例子。 (感谢 Debian!)

$server = 'ftp.us.debian.org';
$port = 21;
$user = 'anonymous';
$pwd = 'foo@bar.xxx';

$conn = ftp_connect($server);
$ret = ftp_login($conn, $user, $pwd);

foreach(array(
'debian/README.html',
'NOT_FOUND.html'
) as $file) {
$listing = ftp_nlist($conn, $file);
if(empty($listing)) {
echo "$file was not found on $server\n";
} else {
echo "$file was found on $server\n";
}
}

或者,表示为一个函数:

function ftp_file_exists(
$server,
$filename,
$user = 'anonymous' ,
$pwd = '',
$port = 21
) {
$conn = @ftp_connect($server);
if($conn === FALSE) {
die("Failed to connect to $server");
}

$ret = @ftp_login($conn, $user, $pwd);
if($ret === FALSE) {
die("Failed to login at $server");
}

$listing = @ftp_nlist($conn, $file);
if($listing === FALSE) {
die("Failed to obtain LIST response from $server");
}

return !empty($listing);
}

在评论中讨论了 LIST 的结果有多么有用和可靠。让我再说几句……

在服务器上创建文件

请注意,您应该避免依赖以下内容:

if(file_not_exists_on_server($filename)) {
create_file_on_server($filename);
}

因为该文件可能会在第一个和第二个函数之间由另一个客户端创建。虽然这在本地文件系统上也是如此,但它可能更容易发生在分布式客户端服务器应用程序中,因为与本地文件系统相比响应时间更长,而且可能有很多甚至是匿名客户端(如上例所示)

在远程创建文件时,我建议在公共(public)可写文件夹中遵循强命名方案以避免冲突。当遵循此方案时,则只需编写即可,无需关心。可能发生的最糟糕的事情是您覆盖了其他人意外创建的内容。但是是谁无意中创建了类似 /client/id/file_name.txt 的东西?


从服务器下载文件或移动、删除服务器上的文件

尝试其中一项操作时,不关心操作前文件是否存在。去做就对了。但如果失败,则需要妥善处理错误。

关于PHP - 检查文件是否存在于不支持 SIZE 的 FTP 服务器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22040633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com