前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >遍历目录清理COS中大小为0的对象 for JAVA

遍历目录清理COS中大小为0的对象 for JAVA

原创
作者头像
wainsun
发布2020-11-06 18:41:25
1.4K0
发布2020-11-06 18:41:25
举报

在上传到COS文件中,会存在一些0字节的文件,对于部分业务来说是无效的。需要做清理。

以下代码片段,通过COS java SDK为例。写了一个通用方法,大家可以保存使用。

接口文档请参见:https://cloud.tencent.com/document/product/436/12263

该方法是通过输入的bucket名称,从根目录进行遍历查询,一次查询1000个对象,直到全部筛选完毕。在识别到对象大小为0并且不是“目录(XX/)”的时候,则将该对象删除。

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

本示例中使用的是单对象删除方法,如果需要删除的对象数量较多,可以调用POST批量删除方法。

https://cloud.tencent.com/document/product/436/14120

需要注意的是,批量删除方法一次最多只能删除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();
        }

    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档