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

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

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

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

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

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

  1. 通过api删除目录下的全部文件后,目录会自动消失
  2. 某些条件下,通过后台建立的文件夹,即使目录下文件都删没了,目录依然会存在,这个需要更多测试,可能和所属地区有关,我测试了华东区是这样的,但是西南成都似乎没有这个特性
  3. 列出列表接口,SDK默认是20个文件,最多是199个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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);
}