【问题标题】:Delete old azure blobs删除旧的 azure blob
【发布时间】:2020-05-06 04:03:37
【问题描述】:

我想使用以下方法删除 30 天前的 blob。 但是,似乎“sourceBlob.getProperties().getLastModified().getTime();”的部分产生异常。 可能的解决方案是什么? 异常消息仅显示 null。 Azure 存储类型为 Storage(通用 v1)

public static void deleteOldBlobs(String source) {
    try {
        System.out.println("deleteOldBlobs started");
        CloudStorageAccount storageAccount = CloudStorageAccount
                .parse(PropertyUtil.getProperty("storageConnectionString"));
        CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
        CloudBlobContainer sourceContainer = blobClient.getContainerReference(source);
        long daysBack = 30;
        System.out.println(daysBack);
        long cutoff = (daysBack * (24 * 60 * 60 * 1000));
        for (ListBlobItem blobItem : sourceContainer.listBlobs()) {
            String sourceFileName = new File(blobItem.getUri().toString()).getName();
            System.out.println(sourceFileName);
            CloudBlockBlob sourceBlob = sourceContainer.getBlockBlobReference(sourceFileName);
            System.out.println(sourceBlob.getProperties().getLastModified().getTime());
            long diff = new Date().getTime()- sourceBlob.getProperties().getLastModified().getTime();

            if (diff > cutoff) {
                sourceBlob.deleteIfExists();
            }
        }
        System.out.println("deleteOldBlobs ended");
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    } finally {
    }
}

【问题讨论】:

  • 您遇到了什么异常?请编辑您的问题并包含这些详细信息。
  • 另外,如果您的存储帐户的类型是通用 v2 (GPv2) 或 Blob 存储,请查看此内容:stackoverflow.com/questions/56903837/…
  • 我只得到了异常消息的空值。存储帐户类型为 Storage(通用 v1)。我会将以上信息添加到我的帖子中。

标签: azure-blob-storage date


【解决方案1】:

您需要调用 downloadAttributes() 方法来填充 blob 的属性。

您的以下代码行:

CloudBlockBlob sourceBlob = sourceContainer.getBlockBlobReference(sourceFileName);

只是创建一个CloudBlockBlob 的实例,其属性设置为默认值。当您调用downloadAttributes 方法时,将进行网络调用并获取 blob 的属性。

所以你的代码是:

CloudBlockBlob sourceBlob = sourceContainer.getBlockBlobReference(sourceFileName);
sourceBlob.downloadAttributes();
System.out.println(sourceBlob.getProperties().getLastModified().getTime());

考虑到您已经列出了 blob,您可以将 blobItem 转换为 CloudBlob,然后您不必获取属性(这会进行网络调用,并且会使整个过程变得更慢且容易出错)。

【讨论】:

  • 您的投射解决方案如此干净高效!
猜你喜欢
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2011-10-08
相关资源
最近更新 更多