遍历目录清理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();
        }

    }
本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
遍历目录清理COS中大小为0的文件 for JAVA
在上传到COS文件中,会存在一些0字节的文件,对于部分业务来说是无效的。需要做清理,否则看着碍眼也没用。
<<上一篇
下一篇>>