遍历目录清理COS中大小为0的文件 for JAVA
在上传到COS文件中,会存在一些0字节的文件,对于部分业务来说是无效的。需要做清理,否则看着碍眼也没用。
以下代码片段,通过COS java SDK为例。写了一个通用方法,大家可以保存使用。
接口文档请参见:https://cloud.tencent.com/document/product/436/12263
该方法是通过输入的bucket名称,从根目录进行遍历查询,一次查询1000个对象,直到全部筛选完毕。在识别到对象大小为0并且不是“目录”的时候,则将该对象删除。
static void listObjects(COSClient cosclient, String bucketName) {
boolean r=true;
String nextMarker="";
boolean isTruncated=true;
//long i=0;
DateTime dt1=DateTime.now();
while(r)
{
// 获取 bucket 下成员(设置 delimiter)
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName(bucketName);
// 设置 list 的 prefix, 表示 list 出来的文件 key 都是以这个 prefix 开始
listObjectsRequest.setPrefix("/");//注意,这里是一个其实目录,可以是根目录/也可以是自定义目录前缀
// 设置 delimiter 为/, 即获取的是直接成员,不包含目录下的递归子成员
listObjectsRequest.setDelimiter("");
// 设置 marker, (marker 由上一次 list 获取到, 或者第一次 list marker 为空)
listObjectsRequest.setMarker(nextMarker);
// 设置最多 list 100个成员,(如果不设置, 默认为1000个,最大允许一次 list 1000个 key)
listObjectsRequest.setMaxKeys(1000);
ObjectListing objectListing = cosclient.listObjects(listObjectsRequest);
// 获取下次 list 的 marke
nextMarker = objectListing.getNextMarker();
// 判断是否已经 list 完, 如果 list 结束, 则 isTruncated 为 false, 否则为 true
isTruncated = objectListing.isTruncated();
System.out.println("nextMarker:"+nextMarker);
System.out.println("isTruncated:"+isTruncated);
List<COSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
for (COSObjectSummary cosObjectSummary : objectSummaries) {
//i++;
// 文件路径
String key = cosObjectSummary.getKey();
// 获取文件长度
long fileSize = cosObjectSummary.getSize();
// 获取文件ETag
String eTag = cosObjectSummary.getETag();
// 获取最后修改时间
Date lastModified = cosObjectSummary.getLastModified();
// 获取文件的存储类型
String StorageClassStr = cosObjectSummary.getStorageClass();
//System.out.println("对象数:"+i);
if(fileSize==0 && !key.endsWith("/"))//这里验证文件大小为0,同时又不是目录
{
System.out.println(key);
System.out.println(fileSize);
System.out.println(eTag);
System.out.println(lastModified);
System.out.println(StorageClassStr);
//单个删除对象
DeleteObject(cosclient,bucketName,key);
System.out.println("----------------------------------------");
}
}
if(isTruncated==false)
{
r=false;
}
}
DateTime dt2=DateTime.now();
System.out.println("开始时间:"+dt1.toString());
System.out.println("结束时间:"+dt2.toString());
}
static void DeleteObject(COSClient cosclient, String bucketName,String key)
{
// 删除 COS 文件
cosclient.deleteObject(bucketName, key);
}
本示例中使用的是单对象删除方法,如果需要删除的对象数量较多,可以调用批量删除方法。
需要注意的是,批量删除方法一次最多只能删除1000个对象,所以,需要控制台对象数量,有兴趣的朋友可以结合起来使用。
static void DeleteObjects(COSClient cosclient, String bucketName) {
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName);
// 设置要删除的key列表, 最多一次删除1000个
ArrayList<KeyVersion> keyList = new ArrayList<KeyVersion>();
// 传入要删除的文件名
keyList.add(new KeyVersion("TEST/1.txt"));
keyList.add(new KeyVersion("TEST/2.txt"));
keyList.add(new KeyVersion("TEST/3.txt"));
keyList.add(new KeyVersion("TEST/4.txt"));
// keyList.add(new KeyVersion("2.mp4"));
deleteObjectsRequest.setKeys(keyList);
// 批量删除文件
try {
DeleteObjectsResult deleteObjectsResult = cosclient.deleteObjects(deleteObjectsRequest);
List<DeletedObject> deleteObjectResultArray = deleteObjectsResult.getDeletedObjects();
for (DeletedObject x : deleteObjectResultArray) {
System.out.println("getDeleteMarkerVersionId:" + x.getDeleteMarkerVersionId());
System.out.println("getVersionId:" + x.getVersionId());
System.out.println("getKey:" + x.getKey());
System.out.println("isDeleteMarker:" + x.isDeleteMarker());
}
} catch (MultiObjectDeleteException mde) { // 如果部分产出成功部分失败, 返回MultiObjectDeleteException
List<DeletedObject> deleteObjects = mde.getDeletedObjects();
List<DeleteError> deleteErrors = mde.getErrors();
} catch (CosServiceException e) { // 如果是其他错误, 比如参数错误, 身份验证不过等会抛出CosServiceException
e.printStackTrace();
} catch (CosClientException e) { // 如果是客户端错误,比如连接不上COS
e.printStackTrace();
}
}