时间: 2020-09-03 00:08:26 人气: 2283 评论: 0
在上传到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(); } }深蓝源码网-一个分享互联网精品资源的网站!-www.69shenlan.com