我想使用以下方法删除30天的Blob。 但是,似乎“ sourceBlob.getProperties()。getLastModified()。getTime();”部分产生异常。 可能的解决方案是什么? 异常消息仅显示为null。 Azure存储类型为存储(通用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 {
}
}
答案 0 :(得分:2)
您需要调用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
,然后就不必获取属性了(这将引起网络调用,并使整个过程变得非常繁琐)速度慢且容易出错)。