是否可以将容器的整个Blob(具有文件)复制到Java中的另一个订阅容器Blob

时间:2020-04-12 19:16:47

标签: java azure azure-storage

我想从blob复制数据,例如storageaccount / container / folder1 / folder2 / folder3。现在,我想将folder3数据复制到另一个订阅容器blob。

我正在使用java和azure sdk,startcopy使用SAS将源复制到目标。但每次都说不存在blob。

但是,如果我提供的源路径是这样的:storageaccount / container / folder1 / folder2 / folder3 / xyz.txt,那么它就可以将数据从源复制到目标。 无法将整个folder3数据复制到目标位置,而不是遍历所有文件吗?

1 个答案:

答案 0 :(得分:0)

您提到startcopy方法,假设您使用的是v8 sdk。您说使用storageaccount/container/folder1/folder2/folder3时会说blob不存在,因为您只提供了一个目录,而startcopy需要一个CloudBlockBlob对象。

因此正确的方法应该是在目录下列出blob,然后循环blob并复制blob。下面是我的测试代码,为了测试,我只是将目录复制到另一个容器。

        CloudStorageAccount storageAccount = CloudStorageAccount.parse(connectStr);
        CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
        try {
            CloudBlobContainer container = blobClient.getContainerReference("test");
            Iterable<ListBlobItem> blobs=container.listBlobs("testfolder/");
            CloudBlobContainer destcontainer=blobClient.getContainerReference("testcontainer");

            for(ListBlobItem blob:blobs){
                CloudBlockBlob srcblob=new CloudBlockBlob(blob.getUri());
                CloudBlockBlob destblob= destcontainer.getBlockBlobReference(srcblob.getName());
                destblob.startCopy(srcblob);

            }

        } catch (StorageException e) {
            e.printStackTrace();
        }

更新:关于复制操作的状态,有一种方法getCopyState,您可以获取状态详细信息,希望这是您想要的。更多详细信息,请检查方法。

CopyState st=destblob.getCopyState();
System.out.println(st.getStatus());