无法从Azure存储1.7升级到2.0

时间:2014-08-14 11:22:44

标签: azure azure-storage azure-storage-blobs

我目前正在参与从Azure 1.7升级到2.2,并且遇到了与Storage发生重大变化的情况。单元测试涵盖了库中的所有存储调用,并且我已解决了大部分更改。

我完全停留在我们的一个核心方法中,它获取目录中的子目录列表。我知道它们不是实际的目录,而是blob名称的一部分,但是在2.0之前存在功能,我们在近30种不同的服务中大量使用它。

存储blob地址是 TESTDATA /测试/ TEST1 / blob.txt

和测试

/// Unit Test
[Test]
public void BuildDirectoryAndRetrieveUsingSubDirectory()
{
  CloudBlobDirectory subDirectory = GetBlobDirectory("testdata/test/");
  IEnumerable<CloudBlobDirectory> dirs = 
    subDirectory.ListBlobs().OfType<CloudBlobDirectory>();
  Assert.AreEqual(1, dirs.Count());
}

GetBlobDirectory的旧1.7代码返回了testdata / test /中每个目录blob的列表,因此在这种情况下将返回test1

/// Azure Storage 1.7
public static CloudBlobDirectory GetBlobDirectory(string directoryReference)
{
  return BlobClient.GetBlobDirectoryReference(directoryReference);
}

我徒劳地尝试使用2.0

获得相同的结果
/// Azure Storage 2.0
public static CloudBlobDirectory GetBlobDirectory(string directoryReference)
{
  string containerName = GetContainerNameFromDirectoryName(directoryReference);
  CloudBlobContainer container = BlobClient.GetContainerReference(containerName);
  return container.GetBlobDirectoryReference(directoryReference);
}

然而,在测试中,dirs只返回&#34;枚举没有产生结果&#34;。

任何人都可以提供帮助 - 我非常希望单独保留测试代码,但是从方法中返回相同的结果。

由于

1 个答案:

答案 0 :(得分:2)

找到了答案,这非常简单。

在StorageClient 1.7中,您传入的前缀值包含容器名称,并且必须以“/".

结尾

所以基本上containerName变成“testdata”,而directoryPrefix变成“test”。

在最新版本中,前缀值不包括容器名称,因此该函数已更改为

public static CloudBlobDirectory GetBlobDirectory(string directoryReference)
{
    string containerName = GetContainerNameFromDirectoryName(directoryReference);
    string directoryPrefix = GetPrefixFormDirectoryName(directoryReference);
    CloudBlobContainer container = BlobClient.GetContainerReference(containerName);
    var blobs = container.ListBlobs(directoryPrefix, false);
    return (CloudBlobDirectory)blobs.Where(b => b as CloudBlobDirectory !=null).First();
}