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);
}
因为第一次和第二次函数之间可能会由另一个客户端创建该文件。虽然这在本地文件系统上也是正确的,但在分布式客户端服务器应用程序中更容易发生,因为响应时间比本地文件系统长,并且可能存在许多甚至匿名的客户端(如上例所示)。
当远程创建文件时,建议在公共可写文件夹中遵循强命名方案以避免冲突。如果遵循此方案,则只需编写并不必担心。最糟糕的情况是您意外覆盖了其他人意外创建的内容。但是,谁会像“ / client / id / file_name.txt”这样意外创建东西呢?
从服务器下载文件或在服务器上移动、删除文件时,请勿关注操作前文件是否存在。只要做就可以了。但如果操作失败,则需要适当处理错误。
ftp_nlist
时,它实际上有多慢? - silkfireftp_rename($connection, $testedFile, 'someThingThatDoesntExists');
如果失败,那么我们就有了答案(_'NO')。但这取决于目标是否可写且我们有重命名的权限。如果成功,那么就将其改回来,同时我们也有了答案('YES'_)。我没有测试过这个方法,但你可以尝试并告诉我会发生什么。 - Alma Doftp_rename
将文件重命名为自身。既然使用ftp_rename
基本上是你的想法,如果你把所有东西都放在一个答案中,我就可以接受它。 - MaxArt