PHP – 检查FTP服务器上是否存在没有SIZE支持的文件
是的,我知道,很难相信这些FTP服务器仍然存在,但它们确实存在. IBM iSeries机器运行此类服务器.
我已经得到了一个涉及ftp_nlist和in_array的答案但是,正如你们中的一些人可能已经猜到的那样,当一个目录包含大量项目时,这很慢. 由于缺少对SIZE的支持,fopen在读取模式下使用时总是会失败(请记住,FTP包装器不支持x),而ftp_size总是返回-1(这是预期的)而file_exists总是返回false(可能是因为它内部使用SIZE?). > ftp_get和ftp_fget可以解决这个问题,但是如果它存在,它们会下载整个文件.不是很好.一种可能的解决方案涉及使用ftp_fget传递仅在读取模式下打开的文件的处理程序,并捕获引发的警告.当文件不存在时会有所不同,但是这个解决方案感觉粗鲁,我真的不知道它是否可行(也许有人可以给出一个例子). 你对此有什么想法吗?
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 $servern"; } else { echo "$file was found on $servern"; } } 或者,表示为一个功能: 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,$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); } 因为有可能该文件将由第一个和第二个函数之间的另一个客户端创建.虽然在本地文件系统上也是如此,但它可以更容易地在分布式客户端服务器应用程序中发生,因为与本地文件系统相比,响应时间更长,并且可能有许多甚至是匿名客户端(如上例所示) 在远程创建文件时,我建议在公共可写文件夹中遵循强大的命名方案,以避免冲突.遵循这个方案,然后只写和不关心.可能发生的最糟糕的事情是你覆盖了其他人偶然创造的东西.但谁偶然创建了像/client/id/file_name.txt这样的东西? 从服务器下载文件或移动,删除服务器上的文件 尝试其中一个操作时,在操作之前不关心文件是否存在.去做就对了.但如果失败,则需要正确处理错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |