ftp_rmdir() 函数用于删除 FTP 服务器上的一个空目录。
该函数是 PHP FTP 扩展的一部分,使用前需要确保 FTP 扩展已启用,并且已经通过 ftp_connect() 或 ftp_ssl_connect() 建立了 FTP 连接。
ftp_rmdir ( resource $ftp_stream , string $directory ) : bool
| 参数 | 类型 | 描述 |
|---|---|---|
$ftp_stream |
resource | 必需的。FTP 连接的标识符,由 ftp_connect() 或 ftp_ssl_connect() 返回。 |
$directory |
string | 必需的。要删除的目录的路径(在 FTP 服务器上)。 |
如果目录删除成功,返回 true;如果失败,返回 false。
以下示例展示了如何连接 FTP 服务器并删除一个空目录。
<?php
// 连接 FTP 服务器
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
$conn = ftp_connect($ftp_server);
if (!$conn) {
die("无法连接到 $ftp_server");
}
// 登录
if (@ftp_login($conn, $ftp_user, $ftp_pass)) {
echo "连接成功\n";
} else {
die("登录失败");
}
// 要删除的目录
$directory = "public_html/empty_directory";
if (ftp_rmdir($conn, $directory)) {
echo "目录删除成功:$directory";
} else {
echo "目录删除失败(目录可能非空或不存在)";
}
// 关闭连接
ftp_close($conn);
?>
在删除目录前,先检查目录是否为空。
<?php
// 假设已经建立了 FTP 连接 $conn
$directory = "public_html/test_directory";
// 检查目录是否存在
if (@ftp_chdir($conn, $directory)) {
// 如果能够进入该目录,说明目录存在
ftp_cdup($conn); // 返回上级目录
// 现在尝试删除
if (ftp_rmdir($conn, $directory)) {
echo "目录删除成功";
} else {
echo "目录删除失败,可能目录非空";
}
} else {
echo "目录不存在";
}
?>
一个完整的示例,包括错误处理。
<?php
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
$directory = "public_html/to_delete";
// 连接 FTP 服务器
$conn = ftp_connect($ftp_server, 21, 30);
if ($conn === false) {
die("FTP 连接失败");
}
// 登录
if (!@ftp_login($conn, $ftp_user, $ftp_pass)) {
ftp_close($conn);
die("FTP 登录失败");
}
// 启用被动模式
ftp_pasv($conn, true);
// 尝试删除目录
if (ftp_rmdir($conn, $directory)) {
echo "目录 '$directory' 删除成功。";
} else {
// 获取错误信息
$error = error_get_last();
echo "目录删除失败。错误信息:" . (isset($error['message']) ? $error['message'] : '未知错误');
// 也可以检查 FTP 服务器的具体响应
echo "<br>尝试列出目录内容以确认是否为空:";
$files = ftp_nlist($conn, $directory);
if (count($files) > 0) {
echo "目录包含以下文件/子目录:" . implode(', ', $files);
} else {
echo "目录似乎为空,但删除仍失败(可能是权限问题)。";
}
}
// 关闭连接
ftp_close($conn);
?>
由于 ftp_rmdir() 只能删除空目录,这里展示如何递归删除非空目录。
<?php
/**
* 递归删除 FTP 目录(包括其中的所有文件和子目录)
* @param resource $conn FTP 连接
* @param string $directory 要删除的目录路径
* @return bool 成功返回 true,失败返回 false
*/
function ftp_delete_directory($conn, $directory) {
// 移除末尾的斜杠
$directory = rtrim($directory, '/');
// 获取目录中的所有项目
$items = ftp_nlist($conn, $directory);
if ($items === false) {
return false;
}
foreach ($items as $item) {
// 跳过当前目录和上级目录的引用
if ($item == '.' || $item == '..') {
continue;
}
// 构建完整路径
$item_path = $directory . '/' . basename($item);
// 检查是文件还是目录
if (ftp_size($conn, $item_path) != -1) {
// 如果是文件,删除它
if (!ftp_delete($conn, $item_path)) {
return false;
}
} else {
// 如果是目录,递归删除
if (!ftp_delete_directory($conn, $item_path)) {
return false;
}
}
}
// 现在目录为空,可以删除
return ftp_rmdir($conn, $directory);
}
// 使用示例
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);
$directory_to_delete = "public_html/old_site";
if (ftp_delete_directory($conn, $directory_to_delete)) {
echo "目录及其内容删除成功";
} else {
echo "删除失败";
}
ftp_close($conn);
?>
ftp_rmdir() 只能删除空目录。如果目录包含文件或子目录,操作将失败。/ 作为路径分隔符。| 错误情况 | 可能的原因 |
|---|---|
| 目录非空 | 尝试删除的目录中包含文件或子目录 |
| 权限不足 | FTP 用户没有删除该目录的权限 |
| 目录不存在 | 指定的目录路径不正确 |
| 当前工作目录 | 尝试删除当前工作目录 |
| 连接问题 | FTP 连接已断开或超时 |