腾讯云 COS 对象存储 不能删除文件夹 COSCMD windows无法使用 解决办法

腾讯云COS的官方工具是一个Python做的半成品,windows下安装极其困难
难以直接使用,需要通过Python安装大量依赖,这些依赖的软件或者windows版难找,或者年代久远,总之不适合工作中使用

如果对一个非长期使用Python的人来说,腾讯云的COSCMD简直就是噩梦

想删除一个文件夹,腾讯云让你难受不已,我甚至怀疑这是不是故意的?让大家的文件都没法删除,他好计费?希望我是想多了,不过我有理由相信作为国内排名靠前的公有云,腾讯是有这个财力做一个普通开发者能用的删除工具的

多喷无益,腾讯云论坛COS板块,一进去就好几个帖子都在喷,可以去看看

以下是我临时写的PHP删除文件夹,使用腾讯云COS V4 php sdk,有需要的可以看看,终于摆脱了可怕的COSCMD

需要注意,腾讯云没有说明的,但是实际使用会遇到的奇异状态

  1. 通过api删除目录下的全部文件后,目录会自动消失
  2. 某些条件下,通过后台建立的文件夹,即使目录下文件都删没了,目录依然会存在,这个需要更多测试,可能和所属地区有关,我测试了华东区是这样的,但是西南成都似乎没有这个特性
  3. 列出列表接口,SDK默认是20个文件,最多是199个
require './include.php';

use QCloud\Cos\Api;

echo "<pre>";

// bucket
$bucket = 'h5';

// 文件夹
$folder = '/test/';

$config = array(
    'app_id'     => '',
    'secret_id'  => '',
    'secret_key' => '',
    'region'     => 'sh',
    'timeout'    => 60,
);

date_default_timezone_set('PRC');
$cosApi = new Api($config);

// 防止文件夹名称错误
if (mb_substr($folder, -1) != "/" || mb_substr($folder, 0, 1) != "/")
{
    throw new Exception('文件夹名称必须以斜线开头结尾');
}

/**
 * 列出文件,最多200个
 *
 * @param  String $folder 文件夹路径
 * @return Array          COS返回的数据
 */
function listFolder($folder)
{
    $cosApi = $GLOBALS["cosApi"];
    $bucket = $GLOBALS["bucket"];
    $ret    = $cosApi->listFolder($bucket, $folder, 199);
    if ($ret["code"] != 0)
    {
        var_export($ret);
        throw new Exception($folder . $ret["message"]);
    }
    $data = $ret["data"]["infos"];
    return $data;
}

/**
 * 删除一个文件
 *
 * @param  String $file 文件绝对路径
 * @return Array        COS返回的数据
 */
function delFile($file)
{
    $cosApi = $GLOBALS["cosApi"];
    $bucket = $GLOBALS["bucket"];
    $ret    = $cosApi->delFile($bucket, $file);
    if ($ret["code"] != 0)
    {
        var_export($ret);
        throw new Exception($file . $ret["message"]);
    }
    return $ret;
}

/**
 * 删除一个空目录
 *
 * @param  String $folder 空的目录绝对路径
 * @return Array          COS返回的数据
 */
function delFolder($folder)
{
    $cosApi = $GLOBALS["cosApi"];
    $bucket = $GLOBALS["bucket"];
    $ret    = $cosApi->delFolder($bucket, $folder);
    if ($ret["code"] != 0)
    {
        var_export($ret);
        throw new Exception($folder . $ret["message"]);
    }
    return $ret;
}

/**
 * 删除目录下全部文件
 *
 * @param  String $baseFolder 要删除的目录
 */
function delAll($baseFolder)
{
    $cosApi = $GLOBALS["cosApi"];
    $bucket = $GLOBALS["bucket"];
    $data   = listFolder($baseFolder);

    foreach ($data as $val)
    {
        // 文件
        if (isset($val["filesize"]))
        {
            $delfile = $baseFolder . $val["name"];
            $res     = delFile($delfile);
            continue;
        }

        // 目录名
        $delfolder = $baseFolder . $val["name"];
        $res       = listFolder($delfolder);

        // 空目录
        if (empty($res))
        {
            $res = delFolder($delfolder);
            continue;
        }

        // 递归
        delAll($delfolder);
    }

    // 删除当前目录,测试发现COS通过API删除时,如果文件为空,将不保留文件夹,故注释
    // delFolder($baseFolder);
}

delAll($folder);

$data = listFolder($folder);
if (empty($data))
{
    echo "删除结束";
}
else
{
    echo "有目录文件超过200个,还需要再删除一次";
    // var_dump($data);
}

相关文章

此处评论已关闭