PHP ftp_rmdir() 函数

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

示例

示例 1:基本使用

以下示例展示了如何连接 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);
?>

示例 2:删除目录前的检查

在删除目录前,先检查目录是否为空。

<?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 "目录不存在";
}
?>

示例 3:完整示例 - 连接、登录、删除目录

一个完整的示例,包括错误处理。

<?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);
?>

示例 4:递归删除非空目录

由于 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 服务器通常使用正斜杠 / 作为路径分隔符。
  • 当前工作目录:不能删除当前工作目录。如果需要删除当前目录,需要先切换到其他目录。
  • 返回值检查:始终检查返回值以确定操作是否成功。
  • 递归删除:PHP 没有内置的 FTP 递归删除函数,需要自己实现(如示例4所示)。

常见错误

错误情况 可能的原因
目录非空 尝试删除的目录中包含文件或子目录
权限不足 FTP 用户没有删除该目录的权限
目录不存在 指定的目录路径不正确
当前工作目录 尝试删除当前工作目录
连接问题 FTP 连接已断开或超时

相关函数