我目前正在参与从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;。
任何人都可以提供帮助 - 我非常希望单独保留测试代码,但是从方法中返回相同的结果。
由于
答案 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();
}