99using System . Threading ;
1010using System . Threading . Tasks ;
1111using Azure ;
12- using Azure . Data . Tables ;
1312using Azure . Storage . Blobs ;
1413using Azure . Storage . Blobs . Models ;
1514using Azure . Storage . Blobs . Specialized ;
@@ -160,52 +159,70 @@ public override async Task<bool> ExistsAsync(string fileName, CancellationToken
160159
161160 public override IEnumerable < StorageListItem > List ( bool getMetadata )
162161 {
163- var blobTraits = new BlobTraits ( ) ;
162+ var blobTraits = BlobTraits . None ;
164163 if ( getMetadata )
165164 {
166165 blobTraits |= BlobTraits . Metadata ;
167166 }
168167
169- foreach ( BlobHierarchyItem blob in _directory . GetBlobsByHierarchy ( traits : blobTraits , prefix : _path ) )
168+ foreach ( BlobHierarchyItem item in _directory . GetBlobsByHierarchy ( traits : blobTraits , prefix : _path ) )
170169 {
171- yield return GetStorageListItem ( _directory . GetBlockBlobClient ( blob . Blob . Name ) ) ;
170+ yield return ToStorageListItem ( item ) ;
172171 }
173172 }
174173
175174 public override async Task < IEnumerable < StorageListItem > > ListAsync ( bool getMetadata , CancellationToken cancellationToken )
176175 {
177- var blobTraits = new BlobTraits ( ) ;
176+ var blobTraits = BlobTraits . None ;
178177 if ( getMetadata )
179178 {
180179 blobTraits |= BlobTraits . Metadata ;
181180 }
182181
183182 var blobList = new List < StorageListItem > ( ) ;
184183
185- await foreach ( BlobHierarchyItem blob in _directory . GetBlobsByHierarchyAsync ( traits : blobTraits , prefix : _path ) )
184+ await foreach ( BlobHierarchyItem item in _directory . GetBlobsByHierarchyAsync ( traits : blobTraits , prefix : _path , cancellationToken : cancellationToken ) )
186185 {
187- blobList . Add ( await GetStorageListItemAsync ( _directory . GetBlockBlobClient ( blob . Blob . Name ) ) ) ;
186+ blobList . Add ( ToStorageListItem ( item ) ) ;
188187 }
189188
190189 return blobList ;
191190 }
192191
192+ private StorageListItem ToStorageListItem ( BlobHierarchyItem item )
193+ {
194+ if ( ! item . IsBlob )
195+ {
196+ throw new ArgumentException (
197+ $ "Unable to convert a non-blob { nameof ( BlobHierarchyItem ) } to a { nameof ( StorageListItem ) } . " +
198+ $ "{ nameof ( item . IsPrefix ) } = { item . IsPrefix } , { nameof ( item . Prefix ) } = '{ item . Prefix } '.", nameof ( item ) ) ;
199+ }
200+
201+ var client = _directory . GetBlockBlobClient ( item . Blob . Name ) ;
202+ return new StorageListItem ( client . Uri , item . Blob . Properties . LastModified , item . Blob . Metadata ) ;
203+ }
204+
193205 public override async Task < IEnumerable < StorageListItem > > ListTopLevelAsync ( bool getMetadata , CancellationToken cancellationToken )
194206 {
195- var prefix = _path . Trim ( '/' ) + '/' ;
196- var blobTraits = new BlobTraits ( ) ;
207+ var prefix = _path . Trim ( '/' ) ;
208+ if ( prefix . Length > 0 )
209+ {
210+ prefix += '/' ;
211+ }
212+
213+ var blobTraits = BlobTraits . None ;
197214 if ( getMetadata )
198215 {
199216 blobTraits |= BlobTraits . Metadata ;
200217 }
201218
202219 var blobList = new List < StorageListItem > ( ) ;
203220
204- await foreach ( BlobHierarchyItem blob in _directory . GetBlobsByHierarchyAsync ( traits : blobTraits , prefix : prefix , delimiter : "/" ) )
221+ await foreach ( BlobHierarchyItem item in _directory . GetBlobsByHierarchyAsync ( traits : blobTraits , prefix : prefix , delimiter : "/" , cancellationToken : cancellationToken ) )
205222 {
206- if ( ! blob . IsPrefix )
223+ if ( ! item . IsPrefix )
207224 {
208- blobList . Add ( await GetStorageListItemAsync ( _directory . GetBlockBlobClient ( blob . Blob . Name ) ) ) ;
225+ blobList . Add ( ToStorageListItem ( item ) ) ;
209226 }
210227 }
211228
@@ -218,24 +235,6 @@ public override async Task SetMetadataAsync(Uri resourceUri, IDictionary<string,
218235 await blob . SetMetadataAsync ( metadata ) ;
219236 }
220237
221- private async Task < StorageListItem > GetStorageListItemAsync ( BlockBlobClient listBlobItem )
222- {
223- var blobPropertiesResponse = await listBlobItem . GetPropertiesAsync ( ) ;
224- var blobProperties = blobPropertiesResponse ? . Value ;
225- var lastModified = blobProperties ? . LastModified ;
226-
227- return new StorageListItem ( listBlobItem . Uri , lastModified , blobProperties ? . Metadata ) ;
228- }
229-
230- private StorageListItem GetStorageListItem ( BlockBlobClient listBlobItem )
231- {
232- var blobPropertiesResponse = listBlobItem . GetProperties ( ) ;
233- var blobProperties = blobPropertiesResponse ? . Value ;
234- var lastModified = blobProperties ? . LastModified ;
235-
236- return new StorageListItem ( listBlobItem . Uri , lastModified , blobProperties ? . Metadata ) ;
237- }
238-
239238 protected override async Task OnCopyAsync (
240239 Uri sourceUri ,
241240 IStorage destinationStorage ,
0 commit comments